keras

Column

keras

KERAS, заколебал меня установкой, но я сделал это

Всем привет, крайний маркдаун библиотеки от меня за курс. Разберем Керасин, авиакерасин, как топливо для глубинного погружения.

Лайфхак по установке, ох, не представляете Вы себе, сколько я его мучал или он меня мучал: 1) Заходим на Змею, Анаконду, регистрируемся, внизу, в самом низу, крутите до конца, будет вкладка “Загрузить Дау..”,кхе-кхе, шучу, простите, Download. 2) Качаем и ставим Анаконду для Python 3.6. 3) Открываем RStudio 5) Простой вариант:

Попросит кучу всего доставить, соглашайтесь, это не больно. 6) Вариант для мазахистов, как я, если начинает жаловаться, что че-то не найдено или keras python not found

  1. Все равно жалуется? Бывает, заходим в Гугл ищем Майкрософт Визуал С, он не может найти MWCP140 или как там его, забыл, MVWCP140.dll

  2. Должен поставиться. Ну или Вы совсем вредный человек.

Керас и с чем его пинают В общем, библиотека жесть какая мощная, разберу на примере, того, как Сенсей рассказывал про него:

Начнем с датасета с Бостонскими данными:

'data.frame':   506 obs. of  14 variables:
 $ crim   : num  0.00632 0.02731 0.02729 0.03237 0.06905 ...
 $ zn     : num  18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
 $ indus  : num  2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
 $ chas   : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 $ nox    : num  0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
 $ rm     : num  6.58 6.42 7.18 7 7.15 ...
 $ age    : num  65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
 $ dis    : num  4.09 4.97 4.97 6.06 6.06 ...
 $ rad    : num  1 2 2 3 3 3 5 5 5 5 ...
 $ tax    : num  296 242 242 222 222 222 311 311 311 311 ...
 $ ptratio: num  15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
 $ b      : num  397 397 393 395 397 ...
 $ lstat  : num  4.98 9.14 4.03 2.94 5.33 ...
 $ medv   : num  24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...

Зависимой переменной провозгласим “Medv”.

На вход Керас принимает только матрицы, без названия измерений (dimensions)

Пилим бюдж.., кхе-кхе, данные, простите, повторяюсь:

Вот нормализация: Есть несколько способов, в том числе, который был изложен в каретке, который использовал Сенсей, но и Керасинки есть свои функции, давайте попробуем

train <- normalize(train)
test <- normalize(test)

Проще, согласитель, юзайте normalize, только normalize юзайте его. Варик от Сенсея:

Моделька, не не, подождите, пока. Есть в керасинке, любимый Ван - хот Энкодинг

Мутим модельку

Сначала сделаем среду, она универсальна для всех типов моделей, которые Вы пожелаете строить при помощи Кераса

Мутим структуру модели:

Тут Важно, методы активации:

  • softmax - распределение вероятности по классам/категориям, простите, если неправильно перевел;
  • elu - экспоненциальная линейная единица;
  • selu - масштабированный экспоненциальный линейный блок (SELU);
  • softplus - f (x) = log (1+ exp (x)) - аналитическая функция, означающее гладкое приближение к линейной функции, чуть круче или хуже, в зависимости от задачи, чем relu;
  • softsign - f(x)=x/1+|x|;
  • relu - часто используемая функция активации, выпрямленный линейный блок;
  • tanh - гиперболическая касательная функция активации;
  • sigmoid - сигмоида;
  • hard_sigmoid - навороченная сигмоида; Оффтопчик: Сигмо́ида — это гладкая монотонная нелинейная функция, имеющая форму буквы “S”, которая часто применяется для «сглаживания» значений некоторой величины. Возрастающая функция.
  • linear - линейная функция. Также для Воинов, есть навороченные подвиды или виды вышеперечисленных функций активации.

Определим ошибки и метрики исчисления эффективности модели:

Loss’ы и метрики: #Могу ошибиться, соррян

  • MSE - mean square error;
  • MAE - mean absolute error;
  • MAPE - mean absolute percentage error;
  • mean_squared_logarithmic_error;
  • squared_hinge;
  • hinge;
  • categorical_hinge;
  • logcosh;
  • categorical_crossentropy;
  • sparse_categorical_crossentropy;
  • binary_crossentropy;
  • kullback_leibler_divergence;
  • poisson;
  • cosine_proximity.

Оффтопчик: Кросс-энтропия обычно используется для количественной оценки разницы между двумя распределениями вероятностей. Обычно «истинный» дистрибутив (тот, который ваш алгоритм обучения машине пытается сопоставить) выражается в терминах одноразового распределения (Гугл транслейт).

Метрики, основная метрика - точность (Accuracy), далее возможные в Керасинке вариации:

  • binary_accuracy;
  • categorical_accuracy;
  • sparse_categorical_accuracy;
  • top_k_categorical_accuracy;
  • sparse_top_k_categorical_accuracy.

Оптимайзеры:

  • SGD - Оптимизатор стохастического градиентного спуска.Включает поддержку импульса, разрыва скорости обучения и импульса Нестерова. Гугл транслейт матерится.

  • RMSprop - рекомендуется оставить параметры этого оптимизатора по умолчанию (кроме скорости обучения, которую можно свободно настраивать).

  • Adagrad - это оптимизатор с определенными параметрами обучения, которые адаптируются относительно того, как часто параметр обновляется во время обучения. Чем больше обновлений получает параметр, тем меньше обновлений. Рекомендуется оставить параметры этого оптимизатора по умолчанию.

  • Adadelta - более надежное расширение Adagrad, которое адаптирует скорости обучения на основе движущегося окна обновлений градиента, вместо того, чтобы накапливать все градиенты прошлого. Таким образом, Adadelta продолжает обучение, даже когда сделано много обновлений. По сравнению с Adagrad, в оригинальной версии Adadelta вам не нужно устанавливать начальную скорость обучения. В этой версии можно установить начальную скорость обучения и коэффициент распада, как и в большинстве других оптимизаторов Keras.

  • Adam - метод стохастической оптимизации.

  • Adamax - навороченный Адам.

  • Nadam - Адам от Нестерова.

  • TFOptimizer - штука от Tensorflow.

Модееееелька:

mymodel <- model %>% 
  fit(train,
      traintarget,
      epochs = 100,
      batch_size = 32,
      validation_split = 0.2)

Оцениваем результаты и предиктуем (прогнозируем или предсказываем - для экстрасенсов, наверное):

$loss
[1] 650.3524

$mean_absolute_error
[1] 23.03027
[1] 23.03027

Output graph

caret

Column

caret

Caret - Чит библиотека

Всем привет, снова, с “сортирным”, пардоньте, юмором. Рассмотрим сегодня библиотеку Карет. Карет - все для Машин Лёрнинг.

Небольшая ремарка:

Caret - Classification And REgression Training.

Ну, если о серьезном, помимо других функций, можно выделить основные их виды:

  1. Разделение данных, мы столкнулись впервые на соревновании по Титанику на Каггле.
  2. Предварительная ласк…, кхе, простите, обработка данных, так называемый препроцессинг.
  3. Выделение и выбор характеристик, особенностей и свойств данных, а также функций (Feature Selection).
  4. Еее, как у Иксзибита в Тачке на прокачку, тюннинг и настройка моделей используя передискретизацию (изменение частот, Скэлинг и пр.).
  5. А также оценка значимости переменных.

Установка CRAN версии, как Мерседес с салона:

Установка AMG версии, с GitHub:

Пойдем по основным функциям

Разделение данных

Думали все? Так просто, нееее

CreateResample - функция, которая создает 1 и более сэмплов-вариантов начальной загрузки, по определенной переменной.

Попробуем?

      Resample01 Resample02 Resample03 Resample04 Resample05 Resample06
 [1,]          2          1          2          2          1          2
 [2,]          2          3          3          2          2          3
 [3,]          8          5          3          2          2          4
 [4,]          9          5          4          4          2          4
 [5,]          9          5          5          6          5          6
 [6,]         12          6          8          7          7          6
 [7,]         13          6         11          8          7          7
 [8,]         15          7         11          8          8          9
 [9,]         17         10         12          9          9          9
[10,]         18         10         12          9         10         10
[11,]         19         12         19         13         12         11
[12,]         19         13         19         13         13         12
[13,]         20         13         20         14         13         13
[14,]         20         13         20         16         14         13
[15,]         21         15         20         17         18         13
[16,]         22         17         20         20         19         14
[17,]         22         17         22         20         20         16
[18,]         22         17         22         21         20         17
[19,]         24         18         22         21         21         18
[20,]         24         18         22         21         21         20
[21,]         25         19         24         24         22         21
[22,]         25         20         26         24         22         21
[23,]         26         21         26         26         26         22
[24,]         27         22         26         26         26         22
[25,]         29         23         26         27         27         23
[26,]         29         24         27         27         27         25
[27,]         29         25         27         29         27         26
[28,]         30         25         28         30         28         27
[29,]         30         25         28         31         28         29
[30,]         31         30         30         32         31         30
[31,]         32         31         30         32         32         31
[32,]         32         32         31         32         32         31
      Resample07 Resample08 Resample09 Resample10
 [1,]          2          2          1          1
 [2,]          7          2          1          1
 [3,]          8          4          1          1
 [4,]          9          5          2          3
 [5,]         10          6          3          4
 [6,]         10          7          4          4
 [7,]         10          8          4          4
 [8,]         11          9          6          4
 [9,]         11         10          7          6
[10,]         12         10          7          7
[11,]         15         10          7          9
[12,]         15         11          8         10
[13,]         16         13         10         11
[14,]         17         14         11         15
[15,]         17         15         14         16
[16,]         18         16         15         16
[17,]         18         17         15         16
[18,]         20         17         16         18
[19,]         20         20         16         19
[20,]         22         21         17         20
[21,]         22         23         18         21
[22,]         26         24         18         22
[23,]         27         27         19         26
[24,]         27         27         20         26
[25,]         27         27         21         27
[26,]         28         28         23         30
[27,]         29         29         23         30
[28,]         29         30         24         32
[29,]         30         30         28         32
[30,]         30         31         29         32
[31,]         31         31         32         32
[32,]         31         31         32         32

createFolds - разделяет данные на К группы, хз пока, что значит К - но, думаю, приблизительно по К - соседям.

$Fold01
[1]  9 10 11

$Fold02
[1] 19 21 29

$Fold03
[1] 14 30 31

$Fold04
[1]  5 20 25 26

$Fold05
[1]  4 22

$Fold06
[1]  7 18 27

$Fold07
[1]  3  8 12 15

$Fold08
[1] 17 23 32

$Fold09
[1] 16 24 28

$Fold10
[1]  1  2  6 13

Вот ща поинтереснее будет, помните Тайм-сериес данные? есть функция, которая может поделить их по датам для кросс-валидации:

$train
$train$Training005
[1] 1 2 3 4 5

$train$Training006
[1] 2 3 4 5 6

$train$Training007
[1] 3 4 5 6 7

$train$Training008
[1] 4 5 6 7 8

$train$Training009
[1] 5 6 7 8 9

$train$Training010
[1]  6  7  8  9 10

$train$Training011
[1]  7  8  9 10 11

$train$Training012
[1]  8  9 10 11 12

$train$Training013
[1]  9 10 11 12 13

$train$Training014
[1] 10 11 12 13 14

$train$Training015
[1] 11 12 13 14 15

$train$Training016
[1] 12 13 14 15 16

$train$Training017
[1] 13 14 15 16 17

$train$Training018
[1] 14 15 16 17 18

$train$Training019
[1] 15 16 17 18 19

$train$Training020
[1] 16 17 18 19 20

$train$Training021
[1] 17 18 19 20 21

$train$Training022
[1] 18 19 20 21 22

$train$Training023
[1] 19 20 21 22 23

$train$Training024
[1] 20 21 22 23 24

$train$Training025
[1] 21 22 23 24 25

$train$Training026
[1] 22 23 24 25 26

$train$Training027
[1] 23 24 25 26 27

$train$Training028
[1] 24 25 26 27 28

$train$Training029
[1] 25 26 27 28 29

$train$Training030
[1] 26 27 28 29 30

$train$Training031
[1] 27 28 29 30 31

$train$Training032
[1] 28 29 30 31 32

$train$Training033
[1] 29 30 31 32 33

$train$Training034
[1] 30 31 32 33 34

$train$Training035
[1] 31 32 33 34 35

$train$Training036
[1] 32 33 34 35 36

$train$Training037
[1] 33 34 35 36 37

$train$Training038
[1] 34 35 36 37 38

$train$Training039
[1] 35 36 37 38 39

$train$Training040
[1] 36 37 38 39 40

$train$Training041
[1] 37 38 39 40 41

$train$Training042
[1] 38 39 40 41 42

$train$Training043
[1] 39 40 41 42 43

$train$Training044
[1] 40 41 42 43 44

$train$Training045
[1] 41 42 43 44 45

$train$Training046
[1] 42 43 44 45 46

$train$Training047
[1] 43 44 45 46 47

$train$Training048
[1] 44 45 46 47 48

$train$Training049
[1] 45 46 47 48 49

$train$Training050
[1] 46 47 48 49 50

$train$Training051
[1] 47 48 49 50 51

$train$Training052
[1] 48 49 50 51 52

$train$Training053
[1] 49 50 51 52 53

$train$Training054
[1] 50 51 52 53 54

$train$Training055
[1] 51 52 53 54 55

$train$Training056
[1] 52 53 54 55 56

$train$Training057
[1] 53 54 55 56 57

$train$Training058
[1] 54 55 56 57 58

$train$Training059
[1] 55 56 57 58 59

$train$Training060
[1] 56 57 58 59 60

$train$Training061
[1] 57 58 59 60 61

$train$Training062
[1] 58 59 60 61 62

$train$Training063
[1] 59 60 61 62 63

$train$Training064
[1] 60 61 62 63 64

$train$Training065
[1] 61 62 63 64 65

$train$Training066
[1] 62 63 64 65 66

$train$Training067
[1] 63 64 65 66 67

$train$Training068
[1] 64 65 66 67 68

$train$Training069
[1] 65 66 67 68 69

$train$Training070
[1] 66 67 68 69 70

$train$Training071
[1] 67 68 69 70 71

$train$Training072
[1] 68 69 70 71 72

$train$Training073
[1] 69 70 71 72 73

$train$Training074
[1] 70 71 72 73 74

$train$Training075
[1] 71 72 73 74 75

$train$Training076
[1] 72 73 74 75 76

$train$Training077
[1] 73 74 75 76 77

$train$Training078
[1] 74 75 76 77 78

$train$Training079
[1] 75 76 77 78 79

$train$Training080
[1] 76 77 78 79 80

$train$Training081
[1] 77 78 79 80 81

$train$Training082
[1] 78 79 80 81 82

$train$Training083
[1] 79 80 81 82 83

$train$Training084
[1] 80 81 82 83 84

$train$Training085
[1] 81 82 83 84 85

$train$Training086
[1] 82 83 84 85 86

$train$Training087
[1] 83 84 85 86 87

$train$Training088
[1] 84 85 86 87 88

$train$Training089
[1] 85 86 87 88 89

$train$Training090
[1] 86 87 88 89 90

$train$Training091
[1] 87 88 89 90 91

$train$Training092
[1] 88 89 90 91 92

$train$Training093
[1] 89 90 91 92 93

$train$Training094
[1] 90 91 92 93 94

$train$Training095
[1] 91 92 93 94 95

$train$Training096
[1] 92 93 94 95 96

$train$Training097
[1] 93 94 95 96 97

$train$Training098
[1] 94 95 96 97 98

$train$Training099
[1] 95 96 97 98 99

$train$Training100
[1]  96  97  98  99 100

$train$Training101
[1]  97  98  99 100 101

$train$Training102
[1]  98  99 100 101 102

$train$Training103
[1]  99 100 101 102 103

$train$Training104
[1] 100 101 102 103 104

$train$Training105
[1] 101 102 103 104 105

$train$Training106
[1] 102 103 104 105 106

$train$Training107
[1] 103 104 105 106 107

$train$Training108
[1] 104 105 106 107 108

$train$Training109
[1] 105 106 107 108 109

$train$Training110
[1] 106 107 108 109 110

$train$Training111
[1] 107 108 109 110 111

$train$Training112
[1] 108 109 110 111 112

$train$Training113
[1] 109 110 111 112 113

$train$Training114
[1] 110 111 112 113 114

$train$Training115
[1] 111 112 113 114 115

$train$Training116
[1] 112 113 114 115 116

$train$Training117
[1] 113 114 115 116 117

$train$Training118
[1] 114 115 116 117 118

$train$Training119
[1] 115 116 117 118 119

$train$Training120
[1] 116 117 118 119 120

$train$Training121
[1] 117 118 119 120 121

$train$Training122
[1] 118 119 120 121 122

$train$Training123
[1] 119 120 121 122 123

$train$Training124
[1] 120 121 122 123 124

$train$Training125
[1] 121 122 123 124 125

$train$Training126
[1] 122 123 124 125 126

$train$Training127
[1] 123 124 125 126 127

$train$Training128
[1] 124 125 126 127 128

$train$Training129
[1] 125 126 127 128 129

$train$Training130
[1] 126 127 128 129 130

$train$Training131
[1] 127 128 129 130 131

$train$Training132
[1] 128 129 130 131 132

$train$Training133
[1] 129 130 131 132 133

$train$Training134
[1] 130 131 132 133 134

$train$Training135
[1] 131 132 133 134 135

$train$Training136
[1] 132 133 134 135 136

$train$Training137
[1] 133 134 135 136 137

$train$Training138
[1] 134 135 136 137 138

$train$Training139
[1] 135 136 137 138 139

$train$Training140
[1] 136 137 138 139 140

$train$Training141
[1] 137 138 139 140 141

$train$Training142
[1] 138 139 140 141 142

$train$Training143
[1] 139 140 141 142 143


$test
$test$Testing005
[1] 6

$test$Testing006
[1] 7

$test$Testing007
[1] 8

$test$Testing008
[1] 9

$test$Testing009
[1] 10

$test$Testing010
[1] 11

$test$Testing011
[1] 12

$test$Testing012
[1] 13

$test$Testing013
[1] 14

$test$Testing014
[1] 15

$test$Testing015
[1] 16

$test$Testing016
[1] 17

$test$Testing017
[1] 18

$test$Testing018
[1] 19

$test$Testing019
[1] 20

$test$Testing020
[1] 21

$test$Testing021
[1] 22

$test$Testing022
[1] 23

$test$Testing023
[1] 24

$test$Testing024
[1] 25

$test$Testing025
[1] 26

$test$Testing026
[1] 27

$test$Testing027
[1] 28

$test$Testing028
[1] 29

$test$Testing029
[1] 30

$test$Testing030
[1] 31

$test$Testing031
[1] 32

$test$Testing032
[1] 33

$test$Testing033
[1] 34

$test$Testing034
[1] 35

$test$Testing035
[1] 36

$test$Testing036
[1] 37

$test$Testing037
[1] 38

$test$Testing038
[1] 39

$test$Testing039
[1] 40

$test$Testing040
[1] 41

$test$Testing041
[1] 42

$test$Testing042
[1] 43

$test$Testing043
[1] 44

$test$Testing044
[1] 45

$test$Testing045
[1] 46

$test$Testing046
[1] 47

$test$Testing047
[1] 48

$test$Testing048
[1] 49

$test$Testing049
[1] 50

$test$Testing050
[1] 51

$test$Testing051
[1] 52

$test$Testing052
[1] 53

$test$Testing053
[1] 54

$test$Testing054
[1] 55

$test$Testing055
[1] 56

$test$Testing056
[1] 57

$test$Testing057
[1] 58

$test$Testing058
[1] 59

$test$Testing059
[1] 60

$test$Testing060
[1] 61

$test$Testing061
[1] 62

$test$Testing062
[1] 63

$test$Testing063
[1] 64

$test$Testing064
[1] 65

$test$Testing065
[1] 66

$test$Testing066
[1] 67

$test$Testing067
[1] 68

$test$Testing068
[1] 69

$test$Testing069
[1] 70

$test$Testing070
[1] 71

$test$Testing071
[1] 72

$test$Testing072
[1] 73

$test$Testing073
[1] 74

$test$Testing074
[1] 75

$test$Testing075
[1] 76

$test$Testing076
[1] 77

$test$Testing077
[1] 78

$test$Testing078
[1] 79

$test$Testing079
[1] 80

$test$Testing080
[1] 81

$test$Testing081
[1] 82

$test$Testing082
[1] 83

$test$Testing083
[1] 84

$test$Testing084
[1] 85

$test$Testing085
[1] 86

$test$Testing086
[1] 87

$test$Testing087
[1] 88

$test$Testing088
[1] 89

$test$Testing089
[1] 90

$test$Testing090
[1] 91

$test$Testing091
[1] 92

$test$Testing092
[1] 93

$test$Testing093
[1] 94

$test$Testing094
[1] 95

$test$Testing095
[1] 96

$test$Testing096
[1] 97

$test$Testing097
[1] 98

$test$Testing098
[1] 99

$test$Testing099
[1] 100

$test$Testing100
[1] 101

$test$Testing101
[1] 102

$test$Testing102
[1] 103

$test$Testing103
[1] 104

$test$Testing104
[1] 105

$test$Testing105
[1] 106

$test$Testing106
[1] 107

$test$Testing107
[1] 108

$test$Testing108
[1] 109

$test$Testing109
[1] 110

$test$Testing110
[1] 111

$test$Testing111
[1] 112

$test$Testing112
[1] 113

$test$Testing113
[1] 114

$test$Testing114
[1] 115

$test$Testing115
[1] 116

$test$Testing116
[1] 117

$test$Testing117
[1] 118

$test$Testing118
[1] 119

$test$Testing119
[1] 120

$test$Testing120
[1] 121

$test$Testing121
[1] 122

$test$Testing122
[1] 123

$test$Testing123
[1] 124

$test$Testing124
[1] 125

$test$Testing125
[1] 126

$test$Testing126
[1] 127

$test$Testing127
[1] 128

$test$Testing128
[1] 129

$test$Testing129
[1] 130

$test$Testing130
[1] 131

$test$Testing131
[1] 132

$test$Testing132
[1] 133

$test$Testing133
[1] 134

$test$Testing134
[1] 135

$test$Testing135
[1] 136

$test$Testing136
[1] 137

$test$Testing137
[1] 138

$test$Testing138
[1] 139

$test$Testing139
[1] 140

$test$Testing140
[1] 141

$test$Testing141
[1] 142

$test$Testing142
[1] 143

$test$Testing143
[1] 144

И разделение по группам - groupKFold, разделение данных по групировочному фактору.

Предварительная ласк…, обработка данных

У Каретки есть оч классная функция preProc, внутри которой можно прописать метод препроцессинга данных, прежде чем пробовать нужно предостеречься от заболе, простите, рассмотрим методы препроцессинга:

  1. Center, Scale и Range - нормализация распределения переменных, можно использовать одновременно несколько через сумку method = c(“scale”,“center”)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Output graph

2

mtcars <- mtcars[mtcars$disp<=mean(mtcars$disp)+sd(mtcars$disp),]

norm <- preProcess(mtcars, method = c("scale"))
mtcars <- predict(norm,mtcars)

hist(mtcars$disp)

Output graph

3

hist(mtcars$disp)

Output graph

3

mtcars <- mtcars[mtcars$disp<=mean(mtcars$disp)+sd(mtcars$disp),]

norm <- preProcess(mtcars, method = c("range"))
mtcars <- predict(norm,mtcars)

hist(mtcars$disp)

Output graph

4

hist(mtcars$disp)

Output graph

5

mtcars <- mtcars[mtcars$disp<=mean(mtcars$disp)+sd(mtcars$disp),]

norm <- preProcess(mtcars, method = c("center"))
mtcars <- predict(norm,mtcars)

hist(mtcars$disp)

Output graph

6

hist(mtcars$disp)

Output graph

7

mtcars <- mtcars[mtcars$disp<=mean(mtcars$disp)+sd(mtcars$disp),]

norm <- preProcess(mtcars, method = c("center","scale"))
mtcars <- predict(norm,mtcars)

hist(mtcars$disp)

Output graph

2.Трансформация данных

в Каретке есть трансформеры, Оптимус прайм, кхм - кхм, шучу, БоксКокс, YeoJohnson, expoTrans:

БоксаКокса - мы помним, забористый, ой, не то. Возводит переменную в максимально возможную степень для максимально возможной корреляции:

'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
Box-Cox Transformation

32 data points used to estimate Lambda

Input data summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.760   3.080   3.695   3.597   3.920   4.930 

Largest/Smallest: 1.79 
Sample Skewness: 0.266 

Estimated Lambda: -0.1 
With fudge factor, Lambda = 0 will be used for transformations
'data.frame':   32 obs. of  12 variables:
 $ mpg     : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl     : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp    : num  160 160 108 258 360 ...
 $ hp      : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat    : num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt      : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec    : num  16.5 17 18.6 19.4 17 ...
 $ vs      : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am      : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear    : num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb    : num  4 4 1 1 2 1 4 2 2 4 ...
 $ drat_new: num  1.36 1.36 1.35 1.12 1.15 ...

YeoJohnson - трансформация - навороченный БоксКокс,но учитывает в расчетах нулевые и отрицательные значения обрабатываемых переменных.

Created from 32 samples and 10 variables

Pre-processing:
  - ignored (0)
  - Yeo-Johnson transformation (10)

Lambda estimates for Yeo-Johnson transformation:
-0.02, 1.13, 0.22, 0.09, -0.32, 0.31, -0.24, -2.02, -0.18, 0.67

expoTrans - выполняет вычисление экспоненциальной функции.

                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
                          mpg       cyl  disp  hp     drat       wt
Mazda RX4           13.417122  8.342726 160.0 110 2.497286 2.144875
Mazda RX4 Wag       13.417122  8.342726 160.0 110 2.497286 2.309996
Datsun 710          14.068810  4.965118 108.0  93 2.478198 1.941892
Hornet 4 Drive      13.566682  8.342726 258.0 110 2.152231 2.520047
Hornet Sportabout   12.501135 12.504948 360.0 175 2.184508 2.652967
Valiant             12.245663  8.342726 225.0 105 1.997311 2.664554
Duster 360          10.451503 12.504948 360.0 245 2.211731 2.727636
Merc 240D           14.604113  4.965118 146.7  62 2.415501 2.504984
Merc 230            14.068810  4.965118 140.8  95 2.504854 2.480759
Merc 280            12.708661  8.342726 167.6 123 2.504854 2.652967
Merc 280C           12.115235  8.342726 167.6 123 2.504854 2.652967
Merc 450SE          11.481976 12.504948 275.8 180 2.147574 3.000930
Merc 450SL          11.893779 12.504948 275.8 180 2.147574 2.817453
Merc 450SLC         10.905456 12.504948 275.8 180 2.147574 2.845057
Cadillac Fleetwood   8.249779 12.504948 472.0 205 2.081144 3.566318
Lincoln Continental  8.249779 12.504948 460.0 215 2.114648 3.641115
Chrysler Imperial   10.655602 12.504948 440.0 230 2.220716 3.607411
Fiat 128            16.758010  4.965118  78.7  66 2.564069 1.857962
Honda Civic         16.292028  4.965118  75.7  52 2.842040 1.425193
Toyota Corolla      17.080187  4.965118  71.1  65 2.613985 1.592660
Toyota Corona       13.603640  4.965118 120.1  97 2.419493 2.041203
Dodge Challenger    11.052610 12.504948 318.0 150 1.997311 2.699098
AMC Javelin         10.905456 12.504948 304.0 150 2.184508 2.650064
Camaro Z28           9.924367 12.504948 350.0 245 2.431410 2.877896
Pontiac Firebird    12.708661 12.504948 400.0 175 2.152231 2.880619
Fiat X1-9           15.478615  4.965118  79.0  66 2.564069 1.666876
Porsche 914-2       15.101111  4.965118 120.3  91 2.685676 1.815396
Lotus Europa        16.292028  4.965118  95.1 113 2.447161 1.345550
Ford Pantera L      11.197729 12.504948 351.0 264 2.613985 2.492891
Ferrari Dino        12.911428  8.342726 145.0 175 2.387277 2.242811
Maserati Bora       10.806210 12.504948 301.0 335 2.354414 2.727636
Volvo 142E          13.566682  4.965118 121.0 109 2.574912 2.249258
                         qsec vs am     gear      carb
Mazda RX4           10.049739  0  1 1.649299 2.5168201
Mazda RX4 Wag       10.235759  0  1 1.649299 2.5168201
Datsun 710          10.728033  1  1 1.649299 0.8836245
Hornet 4 Drive      10.965250  1  0 1.493706 0.8836245
Hornet Sportabout   10.235759  0  0 1.493706 1.5698899
Valiant             11.176666  1  0 1.493706 0.8836245
Duster 360           9.835627  0  0 1.493706 2.5168201
Merc 240D           11.118131  1  0 1.649299 1.5698899
Merc 230            11.825641  1  0 1.649299 1.5698899
Merc 280            10.636056  1  0 1.649299 2.5168201
Merc 280C           10.812393  1  0 1.649299 2.5168201
Merc 450SE          10.358138  0  0 1.493706 2.1028767
Merc 450SL          10.421328  0  0 1.493706 2.1028767
Merc 450SLC         10.545240  0  0 1.493706 2.1028767
Cadillac Fleetwood  10.539122  0  0 1.493706 2.5168201
Lincoln Continental 10.489883  0  0 1.493706 2.5168201
Chrysler Imperial   10.364494  0  0 1.493706 2.5168201
Fiat 128            10.973584  1  1 1.649299 0.8836245
Honda Civic         10.701523  1  1 1.649299 1.5698899
Toyota Corolla      11.091243  1  1 1.649299 0.8836245
Toyota Corona       11.120810  1  0 1.493706 0.8836245
Dodge Challenger    10.186603  0  0 1.493706 1.5698899
AMC Javelin         10.326229  0  0 1.493706 1.5698899
Camaro Z28           9.681913  0  0 1.493706 2.5168201
Pontiac Firebird    10.245533  0  0 1.493706 1.5698899
Fiat X1-9           10.812393  1  1 1.649299 0.8836245
Porsche 914-2       10.130302  0  1 1.740427 1.5698899
Lotus Europa        10.196473  1  1 1.740427 1.5698899
Ford Pantera L       9.341901  0  1 1.740427 2.5168201
Ferrari Dino         9.714446  0  1 1.740427 3.0879918
Maserati Bora        9.380269  0  1 1.740427 3.4325127
Volvo 142E          10.725095  1  1 1.649299 1.5698899
  1. Заполнение пропущенных значений

В поле method, можно вставить следующие функции: “knnImpute”, “bagImpute”,“medianImpute”

Knn - к-ближайшие соседи

bagImpute - честно, хз че это, но подразумеваю, что строятся деревья

medianImpute - медиана импуттинг

По трансформации и препроцессингу данных см.

Модельки и Grid search

Каретка, классная штука, но если руки оттуда, в противном случае каретка может превратиться в тыкву, ну или боль тыквы (рус. “тыква болит” - головная боль).

Дабы не разбираться со всеми методами, там их до кхм, как бы по цензурнее выразиться, охре…, кхм, очень много: Модели для каретки

Запишем синтаксис для пройденных Случайный Лес или Лес случайностей, оба названия попахивают употреблением чего-то, например, кексики от Сюзанны для помощи в Фучур сейлз предикт, шучу, простите Сюзанна.

data(mtcars)
mtcars$target <- mtcars$qsec

index <- createDataPartition(mtcars$target,p=0.7,list=F)

train <- mtcars[index,]
test <- mtcars[-index,]
hist(mtcars$target)

Output graph

go ahead

$label
[1] "Random Forest"

$library
[1] "randomForest"

$loop
NULL

$type
[1] "Classification" "Regression"    

$parameters
  parameter   class                         label
1      mtry numeric #Randomly Selected Predictors

$grid
function (x, y, len = NULL, search = "grid") 
{
    if (search == "grid") {
        out <- data.frame(mtry = caret::var_seq(p = ncol(x), 
            classification = is.factor(y), len = len))
    }
    else {
        out <- data.frame(mtry = unique(sample(1:ncol(x), size = len, 
            replace = TRUE)))
    }
    out
}

$fit
function (x, y, wts, param, lev, last, classProbs, ...) 
randomForest::randomForest(x, y, mtry = param$mtry, ...)
<bytecode: 0x7f83bff2d308>

$predict
function (modelFit, newdata, submodels = NULL) 
if (!is.null(newdata)) predict(modelFit, newdata) else predict(modelFit)
<bytecode: 0x7f83c58a7388>

$prob
function (modelFit, newdata, submodels = NULL) 
if (!is.null(newdata)) predict(modelFit, newdata, type = "prob") else predict(modelFit, 
    type = "prob")

$predictors
function (x, ...) 
{
    varIndex <- as.numeric(names(table(x$forest$bestvar)))
    varIndex <- varIndex[varIndex > 0]
    varsUsed <- names(x$forest$ncat)[varIndex]
    varsUsed
}

$varImp
function (object, ...) 
{
    varImp <- randomForest::importance(object, ...)
    if (object$type == "regression") 
        varImp <- data.frame(Overall = varImp[, "%IncMSE"])
    else {
        retainNames <- levels(object$y)
        if (all(retainNames %in% colnames(varImp))) {
            varImp <- varImp[, retainNames]
        }
        else {
            varImp <- data.frame(Overall = varImp[, 1])
        }
    }
    out <- as.data.frame(varImp)
    if (dim(out)[2] == 2) {
        tmp <- apply(out, 1, mean)
        out[, 1] <- out[, 2] <- tmp
    }
    out
}

$levels
function (x) 
x$classes

$tags
[1] "Random Forest"              "Ensemble Model"            
[3] "Bagging"                    "Implicit Feature Selection"

$sort
function (x) 
x[order(x[, 1]), ]

$oob
function (x) 
{
    out <- switch(x$type, regression = c(sqrt(max(x$mse[length(x$mse)], 
        0)), x$rsq[length(x$rsq)]), classification = c(1 - x$err.rate[x$ntree, 
        "OOB"], e1071::classAgreement(x$confusion[, -dim(x$confusion)[2]])[["kappa"]]))
    names(out) <- if (x$type == "regression") 
        c("RMSE", "Rsquared")
    else c("Accuracy", "Kappa")
    out
}
[1] 1.184866

Забубенил случайно, случайный лес. Хм, случайно наткнулся, можно и нейросеть забабахать, в мозгу у себя пару точно, а потом здесь, ща попробую:

data(mtcars)
mtcars$target <- mtcars$qsec

index <- createDataPartition(mtcars$target,p=0.7,list=F)

train <- mtcars[index,]
test <- mtcars[-index,]
hist(mtcars$target)

fit2 <- train(target~.,train,method = "avNNet", verbose = F)
prediction2 <- predict(fit2,test)
plot(fit2)

RMSE(prediction2,test$target)

#Теперь отскэйлим данные
data(mtcars)
lab <- mtcars$qsec
azino777 <- preProcess(mtcars, method = c("scale","center"))
mtcars <- predict(azino777,mtcars)
mtcars$target <- lab
mtcars
index <- createDataPartition(mtcars$target,p=0.7,list=F)

train <- mtcars[index,]
test <- mtcars[-index,]

fit2 <- train(target~.,train,method = "avNNet")
prediction2 <- predict(fit2,test)
plot(fit2)

RMSE(prediction2,test$target)

Ага, хе.. там, простите, не получилось, но, стоит задуматься

Моделька, примера ради.

Еще один плюс каретки, вместо использования готовых алгоритмов моделей, можете забубенить свой.

Пошли дальше, GridSearch

В Каретке для большинства функций тюнинга, контроля и кросс-валидации используется функция trainControl.

Давайте так, разберусь с функцией trainControl и напишу еще один маркдаун. Так как это очень объемная фукнция, пока дам ссыль выше.

caret CV

Column

caret CV

Caret Cross-Validaция

Всем дарова! Как и обещал пишу про кросс-валидацию каретки.

caret поддерживает различные типы кросс-валидации тип cv, а также количество скрещиваний cv можно указать с помощью функции trainControl (), которая передается аргументу trControl в train ():

Важно отметить, что метод моделирования передается функции main train () и метод кросс-валидации функции trainControl (). Рассмотрим на примерах, дабы было коротко и понятно:

+ Fold01: intercept=TRUE 
- Fold01: intercept=TRUE 
+ Fold02: intercept=TRUE 
- Fold02: intercept=TRUE 
+ Fold03: intercept=TRUE 
- Fold03: intercept=TRUE 
+ Fold04: intercept=TRUE 
- Fold04: intercept=TRUE 
+ Fold05: intercept=TRUE 
- Fold05: intercept=TRUE 
+ Fold06: intercept=TRUE 
- Fold06: intercept=TRUE 
+ Fold07: intercept=TRUE 
- Fold07: intercept=TRUE 
+ Fold08: intercept=TRUE 
- Fold08: intercept=TRUE 
+ Fold09: intercept=TRUE 
- Fold09: intercept=TRUE 
+ Fold10: intercept=TRUE 
- Fold10: intercept=TRUE 
Aggregating results
Fitting final model on full training set

То бишь, внутри данной модели уже есть кросс-валидация (trControl = trainControl(method = “cv”…))

Повторная кросс-валидация обеспечивает лучшую оценку ошибки тестового набора. Более того, вся циклическая процедура может быть повторена. Это занимает больше времени, но дает гораздо больше наборов данных вне выборки для проверки и, следовательно, позволяет более точно оценивать производительность модели. Одна из потрясающих особенностей функции train () в каретке заключается в том, насколько легко запускать очень разные модели или методы перекрестной проверки, просто подбирая несколько простых аргументов для вызова функции. Например, вы можете повторить всю процедуру перекрестной проверки (аеее… кросс-валидации) 5 раз для большей уверенности в своих оценках точности вне образца, например:

+ Fold01: intercept=TRUE 
- Fold01: intercept=TRUE 
+ Fold02: intercept=TRUE 
- Fold02: intercept=TRUE 
+ Fold03: intercept=TRUE 
- Fold03: intercept=TRUE 
+ Fold04: intercept=TRUE 
- Fold04: intercept=TRUE 
+ Fold05: intercept=TRUE 
- Fold05: intercept=TRUE 
+ Fold06: intercept=TRUE 
- Fold06: intercept=TRUE 
+ Fold07: intercept=TRUE 
- Fold07: intercept=TRUE 
+ Fold08: intercept=TRUE 
- Fold08: intercept=TRUE 
+ Fold09: intercept=TRUE 
- Fold09: intercept=TRUE 
+ Fold10: intercept=TRUE 
- Fold10: intercept=TRUE 
Aggregating results
Fitting final model on full training set
Linear Regression 

53940 samples
    9 predictor

No pre-processing
Resampling: Cross-Validated (10 fold) 
Summary of sample sizes: 48545, 48546, 48546, 48546, 48547, 48547, ... 
Resampling results:

  RMSE      Rsquared  MAE     
  1130.701  0.919712  740.4856

Tuning parameter 'intercept' was held constant at a value of TRUE

Давайте сравним оценку точности модели с использованием «lm» в наборе данных «Boston», да да на Керасе, который не ставится на мой рабочий комп, козел. Доверюсь транслейту: Сначала мы сделаем 5-кратное перекрестное подтверждение и повторим всю процедуру, но на этот раз мы проведем пять раундов 5-кратной перекрестной проверки:

Linear Regression 

506 samples
 13 predictor

No pre-processing
Resampling: Cross-Validated (5 fold) 
Summary of sample sizes: 406, 404, 404, 404, 406 
Resampling results:

  RMSE      Rsquared   MAE     
  4.860605  0.7279709  3.404925

Tuning parameter 'intercept' was held constant at a value of TRUE

Настройка AUC для валидации модели, вместо accuracy

Функция trainControl () в каретке может быть настроена для использования AUC (вместо АСС), чтобы настроить параметры обученных моделей. Функция удобства TwoClassSummary () позволяет легко сделать это. ВАЖНОЕ ПРИМЕЧАНИЕ: При использовании TwoClassSummary () обязательно включайте аргумент classProbs = TRUE, иначе ваша модель выдает ошибку!

'data.frame':   208 obs. of  61 variables:
 $ V1   : num  0.02 0.0453 0.0262 0.01 0.0762 0.0286 0.0317 0.0519 0.0223 0.0164 ...
 $ V2   : num  0.0371 0.0523 0.0582 0.0171 0.0666 0.0453 0.0956 0.0548 0.0375 0.0173 ...
 $ V3   : num  0.0428 0.0843 0.1099 0.0623 0.0481 ...
 $ V4   : num  0.0207 0.0689 0.1083 0.0205 0.0394 ...
 $ V5   : num  0.0954 0.1183 0.0974 0.0205 0.059 ...
 $ V6   : num  0.0986 0.2583 0.228 0.0368 0.0649 ...
 $ V7   : num  0.154 0.216 0.243 0.11 0.121 ...
 $ V8   : num  0.16 0.348 0.377 0.128 0.247 ...
 $ V9   : num  0.3109 0.3337 0.5598 0.0598 0.3564 ...
 $ V10  : num  0.211 0.287 0.619 0.126 0.446 ...
 $ V11  : num  0.1609 0.4918 0.6333 0.0881 0.4152 ...
 $ V12  : num  0.158 0.655 0.706 0.199 0.395 ...
 $ V13  : num  0.2238 0.6919 0.5544 0.0184 0.4256 ...
 $ V14  : num  0.0645 0.7797 0.532 0.2261 0.4135 ...
 $ V15  : num  0.066 0.746 0.648 0.173 0.453 ...
 $ V16  : num  0.227 0.944 0.693 0.213 0.533 ...
 $ V17  : num  0.31 1 0.6759 0.0693 0.7306 ...
 $ V18  : num  0.3 0.887 0.755 0.228 0.619 ...
 $ V19  : num  0.508 0.802 0.893 0.406 0.203 ...
 $ V20  : num  0.48 0.782 0.862 0.397 0.464 ...
 $ V21  : num  0.578 0.521 0.797 0.274 0.415 ...
 $ V22  : num  0.507 0.405 0.674 0.369 0.429 ...
 $ V23  : num  0.433 0.396 0.429 0.556 0.573 ...
 $ V24  : num  0.555 0.391 0.365 0.485 0.54 ...
 $ V25  : num  0.671 0.325 0.533 0.314 0.316 ...
 $ V26  : num  0.641 0.32 0.241 0.533 0.229 ...
 $ V27  : num  0.71 0.327 0.507 0.526 0.7 ...
 $ V28  : num  0.808 0.277 0.853 0.252 1 ...
 $ V29  : num  0.679 0.442 0.604 0.209 0.726 ...
 $ V30  : num  0.386 0.203 0.851 0.356 0.472 ...
 $ V31  : num  0.131 0.379 0.851 0.626 0.51 ...
 $ V32  : num  0.26 0.295 0.504 0.734 0.546 ...
 $ V33  : num  0.512 0.198 0.186 0.612 0.288 ...
 $ V34  : num  0.7547 0.2341 0.2709 0.3497 0.0981 ...
 $ V35  : num  0.854 0.131 0.423 0.395 0.195 ...
 $ V36  : num  0.851 0.418 0.304 0.301 0.418 ...
 $ V37  : num  0.669 0.384 0.612 0.541 0.46 ...
 $ V38  : num  0.61 0.106 0.676 0.881 0.322 ...
 $ V39  : num  0.494 0.184 0.537 0.986 0.283 ...
 $ V40  : num  0.274 0.197 0.472 0.917 0.243 ...
 $ V41  : num  0.051 0.167 0.465 0.612 0.198 ...
 $ V42  : num  0.2834 0.0583 0.2587 0.5006 0.2444 ...
 $ V43  : num  0.282 0.14 0.213 0.321 0.185 ...
 $ V44  : num  0.4256 0.1628 0.2222 0.3202 0.0841 ...
 $ V45  : num  0.2641 0.0621 0.2111 0.4295 0.0692 ...
 $ V46  : num  0.1386 0.0203 0.0176 0.3654 0.0528 ...
 $ V47  : num  0.1051 0.053 0.1348 0.2655 0.0357 ...
 $ V48  : num  0.1343 0.0742 0.0744 0.1576 0.0085 ...
 $ V49  : num  0.0383 0.0409 0.013 0.0681 0.023 0.0264 0.0507 0.0285 0.0777 0.0092 ...
 $ V50  : num  0.0324 0.0061 0.0106 0.0294 0.0046 0.0081 0.0159 0.0178 0.0439 0.0198 ...
 $ V51  : num  0.0232 0.0125 0.0033 0.0241 0.0156 0.0104 0.0195 0.0052 0.0061 0.0118 ...
 $ V52  : num  0.0027 0.0084 0.0232 0.0121 0.0031 0.0045 0.0201 0.0081 0.0145 0.009 ...
 $ V53  : num  0.0065 0.0089 0.0166 0.0036 0.0054 0.0014 0.0248 0.012 0.0128 0.0223 ...
 $ V54  : num  0.0159 0.0048 0.0095 0.015 0.0105 0.0038 0.0131 0.0045 0.0145 0.0179 ...
 $ V55  : num  0.0072 0.0094 0.018 0.0085 0.011 0.0013 0.007 0.0121 0.0058 0.0084 ...
 $ V56  : num  0.0167 0.0191 0.0244 0.0073 0.0015 0.0089 0.0138 0.0097 0.0049 0.0068 ...
 $ V57  : num  0.018 0.014 0.0316 0.005 0.0072 0.0057 0.0092 0.0085 0.0065 0.0032 ...
 $ V58  : num  0.0084 0.0049 0.0164 0.0044 0.0048 0.0027 0.0143 0.0047 0.0093 0.0035 ...
 $ V59  : num  0.009 0.0052 0.0095 0.004 0.0107 0.0051 0.0036 0.0048 0.0059 0.0056 ...
 $ V60  : num  0.0032 0.0044 0.0078 0.0117 0.0094 0.0062 0.0103 0.0053 0.0022 0.004 ...
 $ Class: Factor w/ 2 levels "M","R": 2 2 2 2 2 2 2 2 2 2 ...
Generalized Linear Model 

208 samples
 60 predictor
  2 classes: 'M', 'R' 

No pre-processing
Resampling: Cross-Validated (5 fold, repeated 5 times) 
Summary of sample sizes: 167, 167, 166, 167, 165, 166, ... 
Resampling results:

  ROC        Sens       Spec     
  0.7360516  0.7403162  0.6823158

Замутим кась, треньку и тест и модельку с Ауком Роком:

prediction_p <- predict(model_1, test, type = "prob")
colAUC(prediction_p, test$Class, plotROC = TRUE)

Output graph

                M         R
M vs. R 0.7142111 0.7142111

go ahead

prediction_c <- predict(model_1, test)
confusionMatrix(prediction_c, test$Class)
Confusion Matrix and Statistics

          Reference
Prediction  M  R
         M 24 11
         R  9 18
                                          
               Accuracy : 0.6774          
                 95% CI : (0.5466, 0.7906)
    No Information Rate : 0.5323          
    P-Value [Acc > NIR] : 0.01444         
                                          
                  Kappa : 0.3494          
 Mcnemar's Test P-Value : 0.82306         
                                          
            Sensitivity : 0.7273          
            Specificity : 0.6207          
         Pos Pred Value : 0.6857          
         Neg Pred Value : 0.6667          
             Prevalence : 0.5323          
         Detection Rate : 0.3871          
   Detection Prevalence : 0.5645          
      Balanced Accuracy : 0.6740          
                                          
       'Positive' Class : M               
                                          

Ну в целом, таки все, что нарыл. Простите, если не полный список. Ну вот, как говорит Сенсей, Гугл в помощь!

reshape2

Column

reshape2

Манипуляция данными с помощью reshape2

reshape2 представляет собой пакет R, написанный Хэдли Викхэмом, который упрощает преобразование данных между широкими и длинными форматами.

В широкоформатных данных каждый столбец представляет отдельную переменную. Например, набор данных mtcars может быть представлен в широком формате как:

# mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

В данных с длинным форматом один столбец содержит все возможные переменные, а другой столбец содержит их соответствующие значения. Вышеуказанные данные могут быть представлены в длинном формате как:

#    variable value
# 1      mpg  21.0
# 2      mpg  21.0
# 3      mpg  22.8
# 4      mpg  21.4
# 5      mpg  18.7
# 6      mpg  18.1
# ...
#    variable value
# 347     carb     2
# 348     carb     2
# 349     carb     4
# 350     carb     6
# 351     carb     8
# 352     carb     2

Данные с длинным форматом могут иметь более двух столбцов.

В то время как широкоформатные данные более читабельны, длинный формат легче анализировать. Поэтому полезно знать, как конвертировать между ними.

Вот две основные функции в reshape2:

•melt – конвертировать широкоформатные данные в длинный формат

•cast – преобразование данных из длинного формата в широкоформатный

Перед началом работы с данной библиотекой обратимся к ней, чтобы иметь возможность пользоваться функциями:

melt

Преобразуем встроенные данные mtcars: data table {data-navmenu=“R_Libraries” data-icon=“fa-list”}

                car variable value
1         Mazda RX4      mpg  21.0
2     Mazda RX4 Wag      mpg  21.0
3        Datsun 710      mpg  22.8
4    Hornet 4 Drive      mpg  21.4
5 Hornet Sportabout      mpg  18.7
6           Valiant      mpg  18.1

Если мы хотим классифицировать все автомобили по количеству cyl и gear, мы можем сделать следующее:

  cyl gear carVariable carValue
1   6    4         mpg       21
2   6    4         mpg       21
3   4    4         mpg     22.8
4   6    3         mpg     21.4
5   8    3         mpg     18.7
6   6    3         mpg     18.1
    cyl gear carVariable       carValue
347   4    5         car  Porsche 914-2
348   4    5         car   Lotus Europa
349   8    5         car Ford Pantera L
350   6    5         car   Ferrari Dino
351   8    5         car  Maserati Bora
352   4    4         car     Volvo 142E

Как правило, рекомендуется использовать комбинацию переменных, которые могут однозначно идентифицировать каждую точку данных как идентификационные переменные. Следовательно, неплохо использовать cyl и gear, так как есть несколько данных, которые имеют одинаковые значения. Это приведет к проблемам при попытке преобразования данных в первоначальный вид.

cast

Функция cast используется для преобразования данных с длинного формата в широкоформатный. Существует два основных типа функции трансляции:

• dcast - возвращает датафрейм

• acast - возвращает вектор / матрицу / массив

Поскольку объекты dataframe являются наиболее распространенными, разберем как использовать dcast. Мы можем преобразовать данные обратно в широкий формат из длинного формата следующим образом:

                 car cyl  mpg disp  hp drat    wt  qsec vs am gear carb
1        AMC Javelin   8 15.2  304 150 3.15 3.435 17.30  0  0    3    2
2 Cadillac Fleetwood   8 10.4  472 205 2.93 5.250 17.98  0  0    3    4
3         Camaro Z28   8 13.3  350 245 3.73 3.840 15.41  0  0    3    4
4  Chrysler Imperial   8 14.7  440 230 3.23 5.345 17.42  0  0    3    4
5         Datsun 710   4 22.8  108  93 3.85 2.320 18.61  1  1    4    1
6   Dodge Challenger   8 15.5  318 150 2.76 3.520 16.87  0  0    3    2

В данном примере идентификационными переменными были rownames(mtcars) и cyl.

Давайте посмотрим, что произойдет, если бы мы использовали cyl и gear в качестве идентификационных переменных.

  cyl gear mpg disp hp drat wt qsec vs am carb car
1   4    3   1    1  1    1  1    1  1  1    1   1
2   4    4   8    8  8    8  8    8  8  8    8   8
3   4    5   2    2  2    2  2    2  2  2    2   2
4   6    3   2    2  2    2  2    2  2  2    2   2
5   6    4   4    4  4    4  4    4  4  4    4   4
6   6    5   1    1  1    1  1    1  1  1    1   1

Мы получаем предупреждение, в котором говорится: отсутствует функция агрегирования: по умолчанию длина. Набор данных просто показывает общее количество наблюдений для каждой комбинации cyl и gear. Это связано с тем, что функция dcast не может однозначно идентифицировать каждую точку данных.

Мы можем найти среднее значение всех переменных для каждой комбинации cyl и gear, используя параметр fun.aggregate следующим образом:

  cyl gear    mpg    disp    hp drat       wt    qsec  vs   am carb
1   4    3 21.500 120.100  97.0 3.70 2.465000 20.0100 1.0 0.00  1.0
2   4    4 26.925 102.625  76.0 4.11 2.378125 19.6125 1.0 0.75  1.5
3   4    5 28.200 107.700 102.0 4.10 1.826500 16.8000 0.5 1.00  2.0
4   6    3 19.750 241.500 107.5 2.92 3.337500 19.8300 1.0 0.00  1.0
5   6    4 19.750 163.800 116.5 3.91 3.093750 17.6700 0.5 0.50  4.0
6   6    5 19.700 145.000 175.0 3.62 2.770000 15.5000 0.0 1.00  6.0

Здесь мы удалили столбец car, потому что нам не нужны никакие нечисловые значения в столбце значений mtcarsMelt, иначе это вызовет ошибки при попытке вычислить среднее значение.

data.table

Column

data.table

Пакет Data.table в R

Загрузка данных для иллюстрации

library(data.table)
library(magrittr)
library(Lahman)
Teams = as.data.table(Teams)
Teams
      yearID lgID teamID franchID divID Rank   G Ghome  W  L DivWin WCWin
   1:   1871   NA    BS1      BNA    NA    3  31    NA 20 10     NA    NA
   2:   1871   NA    CH1      CNA    NA    2  28    NA 19  9     NA    NA
   3:   1871   NA    CL1      CFC    NA    8  29    NA 10 19     NA    NA
   4:   1871   NA    FW1      KEK    NA    7  19    NA  7 12     NA    NA
   5:   1871   NA    NY2      NNA    NA    5  33    NA 16 17     NA    NA
  ---                                                                    
2831:   2016   NL    SLN      STL     C    2 162    81 86 76      N     N
2832:   2016   AL    TBA      TBD     E    5 162    81 68 94      N     N
2833:   2016   AL    TEX      TEX     W    1 162    81 95 67      Y     N
2834:   2016   AL    TOR      TOR     E    2 162    81 89 73      N     Y
2835:   2016   NL    WAS      WSN     E    1 162    81 95 67      Y     N
      LgWin WSWin   R   AB    H X2B X3B  HR  BB   SO  SB CS HBP SF  RA  ER
   1:     N    NA 401 1372  426  70  37   3  60   19  73 NA  NA NA 303 109
   2:     N    NA 302 1196  323  52  21  10  60   22  69 NA  NA NA 241  77
   3:     N    NA 249 1186  328  35  40   7  26   25  18 NA  NA NA 341 116
   4:     N    NA 137  746  178  19   8   2  33    9  16 NA  NA NA 243  97
   5:     N    NA 302 1404  403  43  21   1  33   15  46 NA  NA NA 313 121
  ---                                                                     
2831:     N     N 779 5548 1415 299  32 225 526 1318  35 26  70 41 712 656
2832:     N     N 672 5481 1333 288  32 216 449 1482  60 37  69 28 713 665
2833:     N     N 765 5525 1446 257  23 215 436 1220  99 36  70 40 757 700
2834:     N     N 759 5479 1358 276  18 221 632 1362  54 24  55 40 666 613
2835:     N     N 763 5490 1403 268  29 203 536 1252 121 39  64 63 612 570
       ERA CG SHO SV IPouts   HA HRA BBA  SOA   E  DP    FP
   1: 3.55 22   1  3    828  367   2  42   23 225  NA 0.838
   2: 2.76 25   0  1    753  308   6  28   22 218  NA 0.829
   3: 4.11 23   0  0    762  346  13  53   34 223  NA 0.814
   4: 5.17 19   1  0    507  261   5  21   17 163  NA 0.803
   5: 3.72 32   1  0    879  373   7  42   22 227  NA 0.839
  ---                                                      
2831: 4.08  2  10 38   4345 1432 159 475 1290 107 169 0.983
2832: 4.20  1   8 42   4279 1395 210 491 1357  94 129 0.984
2833: 4.37  1   6 56   4329 1441 201 534 1154  97 190 0.984
2834: 3.78  0  10 43   4378 1340 183 461 1314  88 144 0.986
2835: 3.51  1  12 46   4379 1272 155 468 1476  73 142 0.988
                         name                          park attendance BPF
   1:    Boston Red Stockings           South End Grounds I         NA 103
   2: Chicago White Stockings       Union Base-Ball Grounds         NA 104
   3:  Cleveland Forest Citys  National Association Grounds         NA  96
   4:    Fort Wayne Kekiongas                Hamilton Field         NA 101
   5:        New York Mutuals      Union Grounds (Brooklyn)         NA  90
  ---                                                                     
2831:     St. Louis Cardinals             Busch Stadium III    3444490 100
2832:          Tampa Bay Rays               Tropicana Field    1286163  93
2833:           Texas Rangers Rangers Ballpark in Arlington    2710402 106
2834:       Toronto Blue Jays                 Rogers Centre    3392099 111
2835:    Washington Nationals                Nationals Park    2481938 100
      PPF teamIDBR teamIDlahman45 teamIDretro
   1:  98      BOS            BS1         BS1
   2: 102      CHI            CH1         CH1
   3: 100      CLE            CL1         CL1
   4: 107      KEK            FW1         FW1
   5:  88      NYU            NY2         NY2
  ---                                        
2831:  99      STL            SLN         SLN
2832:  94      TBR            TBA         TBA
2833: 105      TEX            TEX         TEX
2834: 110      TOR            TOR         TOR
2835:  98      WSN            MON         WAS

создание подмножества для краткости

Pitching = as.data.table(Pitching)
Pitching = Pitching[ , .(playerID, yearID, teamID, W, L, G, ERA)]
Pitching
        playerID yearID teamID  W  L  G   ERA
    1: bechtge01   1871    PH1  1  2  3  7.96
    2: brainas01   1871    WS3 12 15 30  4.50
    3: fergubo01   1871    NY2  0  0  1 27.00
    4: fishech01   1871    RC1  4 16 24  4.35
    5: fleetfr01   1871    NY2  0  1  1 10.00
   ---                                       
44959: zastrro01   2016    CHN  1  0  8  1.13
44960: zieglbr01   2016    ARI  2  3 36  2.82
44961: zieglbr01   2016    BOS  2  4 33  1.52
44962: zimmejo02   2016    DET  9  7 19  4.87
44963:  zychto01   2016    SEA  1  0 12  3.29

используется для определения множества команд из исторических данных и подтверждается что они хранятся как character

fkt = c('teamIDBR', 'teamIDlahman45', 'teamIDretro')
Teams[ , sapply(.SD, is.character), .SDcols = fkt]
      teamIDBR teamIDlahman45    teamIDretro 
          TRUE           TRUE           TRUE 

иллюстрация конвертации данных в символ и обратно в таблицу данных

setDF(Teams)
sapply(Teams[ , fkt], is.character)
      teamIDBR teamIDlahman45    teamIDretro 
          TRUE           TRUE           TRUE 
setDT(Teams)

sapply/lapply применяет FUN к каждому столбцу и возвращает результат как обычно sapply/lapply (здесь FUN == is.character возвращает logical длины 1, поэтому sapply возвращает вектор)

Синтаксис для преобразования этих столбцов в factor очень похож: просто добавьте оператор присваивания :=

Teams[ , (fkt) := lapply(.SD, factor), .SDcols = fkt]

Применение.SDcols (и :=) для принятия вектора character или вектора integer позиций столбцов также может быть полезна для преобразования имен столбцов * на основе шаблонов *. Мы могли бы преобразовать все столбцы factor в character и затем преобразуйте все столбцы, содержащие team обратно в factor

Teams[ , (fkt) := lapply(.SD, factor), .SDcols = fkt]
fkt_idx = which(sapply(Teams, is.factor))
Teams[ , (fkt_idx) := lapply(.SD, as.character), .SDcols = fkt_idx]
team_idx = grep('team', names(Teams), value = TRUE)
Teams[ , (team_idx) := lapply(.SD, factor), .SDcols = team_idx]

Групповое подмножество: .SD сам является data.table, а .N относится к общему количеству строк в группе (он равен nrow(.SD) внутри каждой группы), поэтому .SD[.N] возвращает всю .SD для последней строки, связанной с каждым teamID

Teams[ , .SD[.N], by = teamID]
     teamID yearID lgID franchID divID Rank   G Ghome  W  L DivWin WCWin
  1:    BS1   1875   NA      BNA    NA    1  82    NA 71  8     NA    NA
  2:    CH1   1871   NA      CNA    NA    2  28    NA 19  9     NA    NA
  3:    CL1   1872   NA      CFC    NA    7  22    NA  6 16     NA    NA
  4:    FW1   1871   NA      KEK    NA    7  19    NA  7 12     NA    NA
  5:    NY2   1875   NA      NNA    NA    6  71    NA 30 38     NA    NA
 ---                                                                    
145:    ANA   2004   AL      ANA     W    1 162    81 92 70      Y     N
146:    ARI   2016   NL      ARI     W    4 162    81 69 93      N     N
147:    MIL   2016   NL      MIL     C    4 162    81 73 89      N     N
148:    TBA   2016   AL      TBD     E    5 162    81 68 94      N     N
149:    MIA   2016   NL      FLA     E    3 161    80 79 82      N     N
     LgWin WSWin   R   AB    H X2B X3B  HR  BB   SO  SB CS HBP SF  RA  ER
  1:     Y    NA 831 3516 1124 157  54  14  31    0  NA NA  NA NA 343 138
  2:     N    NA 302 1196  323  52  21  10  60   22  69 NA  NA NA 241  77
  3:     N    NA 174  935  272  37   6   0  17   13  12  3  NA NA 254 101
  4:     N    NA 137  746  178  19   8   2  33    9  16 NA  NA NA 243  97
  5:     N    NA 328 2683  626  84  24   7  21    0  NA NA  NA NA 425 170
 ---                                                                     
145:     N     N 836 5675 1603 272  37 162 450  942 143 46  73 41 734 692
146:     N     N 752 5665 1479 285  56 190 463 1427 137 31  50 38 890 821
147:     N     N 671 5330 1299 249  19 194 599 1543 181 56  37 39 733 650
148:     N     N 672 5481 1333 288  32 216 449 1482  60 37  69 28 713 665
149:     N     N 655 5547 1460 259  42 128 447 1213  71 28  54 38 682 646
      ERA CG SHO SV IPouts   HA HRA BBA  SOA   E  DP    FP
  1: 1.70 60  10 17   2196  751   2  29    0 464  NA 0.868
  2: 2.76 25   0  1    753  308   6  28   22 218  NA 0.829
  3: 4.57 15   0  0    597  289   6  24    0 168  NA 0.823
  4: 5.17 19   1  0    507  261   5  21   17 163  NA 0.803
  5: 2.40 70   2  0   1911  716   3  24    0 526  NA 0.838
 ---                                                      
145: 4.28  2  11 50   4363 1476 170 502 1164  90 126 0.985
146: 5.09  2   7 31   4354 1563 202 603 1318 101 143 0.983
147: 4.08  0   7 46   4303 1450 178 532 1175 136 145 0.978
148: 4.20  1   8 42   4279 1395 210 491 1357  94 129 0.984
149: 4.05  0  12 55   4305 1358 152 595 1379  86 137 0.985
                        name                         park attendance BPF
  1:    Boston Red Stockings          South End Grounds I         NA 103
  2: Chicago White Stockings      Union Base-Ball Grounds         NA 104
  3:  Cleveland Forest Citys National Association Grounds         NA  96
  4:    Fort Wayne Kekiongas               Hamilton Field         NA 101
  5:        New York Mutuals     Union Grounds (Brooklyn)         NA  99
 ---                                                                    
145:          Anaheim Angels    Angels Stadium of Anaheim    3375677  97
146:    Arizona Diamondbacks                  Chase Field    2036216 107
147:       Milwaukee Brewers                  Miller Park    2314614  99
148:          Tampa Bay Rays              Tropicana Field    1286163  93
149:           Miami Marlins                 Marlins Park    1712417  93
     PPF teamIDBR teamIDlahman45 teamIDretro
  1:  96      BOS            BS1         BS1
  2: 102      CHI            CH1         CH1
  3: 100      CLE            CL1         CL1
  4: 107      KEK            FW1         FW1
  5: 100      NYU            NY2         NY2
 ---                                        
145:  97      ANA            ANA         ANA
146: 108      ARI            ARI         ARI
147:  99      MIL            ML4         MIL
148:  94      TBR            TBA         TBA
149:  93      MIA            FLO         MIA

Группа Optima: Вместо того, чтобы фиксировать элемент из каждого под data.table, мы теперь динамически определяем искомый индекс следующим образом:

Teams[ , .SD[which.max(R)], by = teamID]
     teamID yearID lgID franchID divID Rank   G Ghome   W  L DivWin WCWin
  1:    BS1   1875   NA      BNA    NA    1  82    NA  71  8     NA    NA
  2:    CH1   1871   NA      CNA    NA    2  28    NA  19  9     NA    NA
  3:    CL1   1871   NA      CFC    NA    8  29    NA  10 19     NA    NA
  4:    FW1   1871   NA      KEK    NA    7  19    NA   7 12     NA    NA
  5:    NY2   1872   NA      NNA    NA    3  56    NA  34 20     NA    NA
 ---                                                                     
145:    ANA   2000   AL      ANA     W    3 162    81  82 80      N     N
146:    ARI   1999   NL      ARI     W    1 162    81 100 62      Y     N
147:    MIL   1999   NL      MIL     C    5 161    80  74 87      N     N
148:    TBA   2009   AL      TBD     E    3 162    81  84 78      N     N
149:    MIA   2016   NL      FLA     E    3 161    80  79 82      N     N
     LgWin WSWin   R   AB    H X2B X3B  HR  BB   SO  SB CS HBP SF  RA  ER
  1:     Y    NA 831 3516 1124 157  54  14  31    0  NA NA  NA NA 343 138
  2:     N    NA 302 1196  323  52  21  10  60   22  69 NA  NA NA 241  77
  3:     N    NA 249 1186  328  35  40   7  26   25  18 NA  NA NA 341 116
  4:     N    NA 137  746  178  19   8   2  33    9  16 NA  NA NA 243  97
  5:     N    NA 523 2423  668  86  13   4  55   52  56 21  NA NA 362 145
 ---                                                                     
145:     N     N 864 5628 1574 309  34 236 608 1024  93 52  47 43 869 805
146:     N     N 908 5658 1566 289  46 216 588 1045 137 39  NA NA 676 615
147:     N     N 815 5582 1524 299  30 165 658 1065  81 33  NA NA 886 812
148:     N     N 803 5462 1434 297  36 199 642 1229 194 61  49 45 754 686
149:     N     N 655 5547 1460 259  42 128 447 1213  71 28  54 38 682 646
      ERA CG SHO SV IPouts   HA HRA BBA  SOA   E  DP    FP
  1: 1.70 60  10 17   2196  751   2  29    0 464  NA 0.868
  2: 2.76 25   0  1    753  308   6  28   22 218  NA 0.829
  3: 4.11 23   0  0    762  346  13  53   34 223  NA 0.814
  4: 5.17 19   1  0    507  261   5  21   17 163  NA 0.803
  5: 2.55 54   3  0   1536  618   2  32    0 326  NA 0.867
 ---                                                      
145: 5.00  5   3 46   4344 1534 228 662  846 134 182 0.978
146: 3.77 16   9 42   4401 1387 176 543 1198 104 129 0.983
147: 5.07  2   5 40   4327 1618 213 616  987 127 142 0.979
148: 4.33  3   5 41   4282 1421 183 515 1125  98 135 0.983
149: 4.05  0  12 55   4305 1358 152 595 1379  86 137 0.985
                        name                         park attendance BPF
  1:    Boston Red Stockings          South End Grounds I         NA 103
  2: Chicago White Stockings      Union Base-Ball Grounds         NA 104
  3:  Cleveland Forest Citys National Association Grounds         NA  96
  4:    Fort Wayne Kekiongas               Hamilton Field         NA 101
  5:        New York Mutuals     Union Grounds (Brooklyn)         NA  93
 ---                                                                    
145:          Anaheim Angels   Edison International Field    2066982 102
146:    Arizona Diamondbacks            Bank One Ballpark    3019654 101
147:       Milwaukee Brewers               County Stadium    1701796  99
148:          Tampa Bay Rays              Tropicana Field    1874962  98
149:           Miami Marlins                 Marlins Park    1712417  93
     PPF teamIDBR teamIDlahman45 teamIDretro
  1:  96      BOS            BS1         BS1
  2: 102      CHI            CH1         CH1
  3: 100      CLE            CL1         CL1
  4: 107      KEK            FW1         FW1
  5:  92      NYU            NY2         NY2
 ---                                        
145: 103      ANA            ANA         ANA
146: 101      ARI            ARI         ARI
147:  99      MIL            ML4         MIL
148:  97      TBR            TBA         TBA
149:  93      MIA            FLO         MIA

Сгруппированная регрессия: Предположим, что мы ожидаем, что эта зависимость будет отличаться по команде (т.е. для каждой команды будет другой наклон). Мы можем легко повторить эту регрессию, чтобы исследовать гетерогенность в этой зависимости следующим образом (отметив, что стандартные ошибки из этого подхода в целом неверны - спецификация ERA ~ W*teamID

r <- Pitching[ , if (.N > 20) .(w_coef = coef(lm(ERA ~ W))['W']), by = teamID
          ][ , hist(w_coef, 20, xlab = 'Fitted Coefficient on W',
                    ylab = 'Number of Teams', col = 'darkgreen',
                    main = 'Distribution of Team-Level Win Coefficients on ERA')]

Output graph

lubridate

Column

lubridate

(lubridate) предоставляет инструменты, которые облегчают работу с датами при анализе данных. Эти инструменты сгруппированы по решению определенных целей.

1. СИНХРОНИЗАЦИЯ ДАТЫ

  • Lubridate считывают строки в R как объекты времени POSIXct. Мы можем выбрать функцию, в котором элементы года обозначаются знаком (‘y’), месяца (‘m’) и дня (‘d’). Таким образом мы можем использовать функции dmy(), myd(), ymd(), ydm(), dym(), mdy(), ymd_hms();
ymd("20110604")
[1] "2011-06-04"
mdy("06-04-2011")
[1] "2011-06-04"
dmy("04/06/2011")
[1] "2011-06-04"
  • Если ваша дата включает информацию о времени, добавьте h, m и s к имени функции: ymd_hms(). Чтобы прочитать даты в определенном часовом поясе, указываем официальное название этого часового пояса в аргументе tz.
arrive <- ymd_hms("2011-06-04 12:00:00", tz = "Pacific/Auckland")
arrive
[1] "2011-06-04 12:00:00 NZST"
leave <- ymd_hms("2011-08-10 14:00:00", tz = "Pacific/Auckland")
leave
[1] "2011-08-10 14:00:00 NZST"

2. НАСТРОЙКА И ИЗВЛЕЧЕНИЕ ИНФОРМАЦИИ

  • Можно извлекать информацию из дат, с помощью функций second(), minute(), hour(), day(), wday(), yday(), week(), month(), year(), and tz().
second(arrive)
[1] 0
second(arrive) <- 25
arrive
[1] "2011-06-04 12:00:25 NZST"
wday(arrive)
[1] 7

3. ЧАСОВЫЕ ПОЯСА - Есть две очень полезные вещи, связанные с датами и часовыми поясами. Первая, мы можем отобразить одно и то же время в других часовых поясах. Вторая, мы можем создайть новое время, объединив существующее время часов с новым часовым поясом. Они выполняются с помощью with_tz() и force_tz().

  • Пример: Я был в Окленде, Новая Зеландия, договорился поговорить с другом Хэдли по скайпу в 9:00 утра по Оклендскому времени. Какое это было время для Хэдли, который живет в Хьюстоне, штат Техас?
meeting <- ymd_hms("2011-07-01 09:00:00", tz = "Pacific/Auckland")
with_tz(meeting, "America/Chicago")
[1] "2011-06-30 16:00:00 CDT"
meeting
[1] "2011-07-01 09:00:00 NZST"
  • Что, если Хэдли допустил ошибку и назначил в 9:00 своего времени? Какое время это будет у меня?
mistake <- force_tz(meeting, "America/Chicago")
with_tz(mistake, "Pacific/Auckland")
[1] "2011-07-02 02:00:00 NZST"
mistake
[1] "2011-07-01 09:00:00 CDT"

4. ВРЕМЕННЫЕ ИНТЕРВАЛЫ

  • Мы можем сохранить промежуток времени как объект интервального класса с lubridate.
auckland <- interval(arrive, leave) 
auckland
[1] 2011-06-04 12:00:25 NZST--2011-08-10 14:00:00 NZST

or

auckland <- arrive %--% leave
auckland
[1] 2011-06-04 12:00:25 NZST--2011-08-10 14:00:00 NZST
  • Пример: Крис, посетил различные конференции в этом году, включая Совместные статистические совещания (JSM). Его не было в стране с 20 июля до конца августа.
jsm <- interval(ymd(20110720, tz = "Pacific/Auckland"), ymd(20110831, tz = "Pacific/Auckland"))
jsm
[1] 2011-07-20 NZST--2011-08-31 NZST
  • Будет ли мой визит пересекаться с его поездками? Да.
int_overlaps(jsm, auckland)
[1] TRUE
  • В каком промежутке моего визита Крис будет на конференциях?
setdiff(auckland, jsm)
[1] 2011-06-04 12:00:25 NZST--2011-07-20 NZST
  • ! Другие функции для интервалов: int_start, int_end, int_flip, int_shift, int_aligns, union, intersect, setdiff, and %within%.

5. АРИФМЕТИКА С ДАТАМИ

  • lubridate также предоставляет два общих класса временного диапазона: продолжительность и периоды. “d” (for duration)
minutes(2)
[1] "2M 0S"

dminutes(2) ## duration

dminutes(2)
[1] "120s (~2 minutes)"

leap_year(2011) ## regular year

leap_year(2011) ## regular year
[1] FALSE

ymd(20110101) + dyears(1)

ymd(20110101) + dyears(1)
[1] "2012-01-01"
ymd(20110101) + years(1)
[1] "2012-01-01"
leap_year(2012) ## leap year
[1] TRUE
ymd(20120101) + dyears(1)
[1] "2012-12-31"
ymd(20120101) + years(1)
[1] "2013-01-01"
  • Мы можем использовать периоды и длительности, чтобы выполнить базовую арифметику с датами. Например, если бы я хотел настроить повторную еженедельную встречу в Skype с Hadley, это было бы так:
meetings <- meeting + weeks(0:5)
meetings
[1] "2011-07-01 09:00:00 NZST" "2011-07-08 09:00:00 NZST"
[3] "2011-07-15 09:00:00 NZST" "2011-07-22 09:00:00 NZST"
[5] "2011-07-29 09:00:00 NZST" "2011-08-05 09:00:00 NZST"
  • Хэдли ездил на конференции одновременно с Крисом. Какие из этих пересекуться?
meetings %within% jsm
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
  • Как долго я находился в Окленде?
auckland / ddays(1)
[1] 67.08304
auckland / ddays(2)
[1] 33.54152
auckland / dminutes(1)
[1] 96599.58
  • В качестве альтернативы мы можем выполнять модульное и целочисленное деление. Иногда это более разумно, чем разделение(неясно, как выражать остаток как долю месяца, потому что длина месяца постоянно меняется).
auckland %/% months(1)
[1] 2
auckland %% months(1)
[1] 2011-08-04 12:00:25 NZST--2011-08-10 14:00:00 NZST
  • Модуль с временным интервалом возвращает остаток в качестве нового (меньшего) интервала. Вы можете включить этот или любой интервал в обобщенный временной интервал с as.period.
as.period(auckland %% months(1))
[1] "6d 1H 59M 35S"
as.period(auckland)
[1] "2m 6d 1H 59M 35S"
  • Продолжительность месяцев и лет меняется так часто, что выполнение арифметики с ними может быть неинтуитивным.
jan31 <- ymd("2013-01-31")
jan31
[1] "2013-01-31"
jan31 + months(0:11)
 [1] "2013-01-31" NA           "2013-03-31" NA           "2013-05-31"
 [6] NA           "2013-07-31" "2013-08-31" NA           "2013-10-31"
[11] NA           "2013-12-31"
  • floor_date() Округляем до ближайшей еденицы
floor_date(jan31, "month") + months(0:11) + days(31)
 [1] "2013-02-01" "2013-03-04" "2013-04-01" "2013-05-02" "2013-06-01"
 [6] "2013-07-02" "2013-08-01" "2013-09-01" "2013-10-02" "2013-11-01"
[11] "2013-12-02" "2014-01-01"
jan31 %m+% months(0:11)
 [1] "2013-01-31" "2013-02-28" "2013-03-31" "2013-04-30" "2013-05-31"
 [6] "2013-06-30" "2013-07-31" "2013-08-31" "2013-09-30" "2013-10-31"
[11] "2013-11-30" "2013-12-31"

dplyr

Column

dplyr

Работа с библиотекой dplyr

  1. Загружаем библиотеку

Библиотека dplyr удобный и мощный инструмент по работе с датасетами, Позволяет заниматься data-engineering намного быстрее, чем в Excel.

Основные функции dplyr:

  • filter() выбрать по условию
  • arrange() сортировать
  • select() выбрать столбцы
  • slice() вытаскивает заданные колонки
  • mutate() создать новую колонку
  • group_by() группирует столбец по факторным значениям
  • summarise() суммирует данные в одну строку значений
  • sample_n() сделать случайную выборку

Давайте создадим данные для того что бы увидеть разницу между data.frame и data_frame. data_frame это функция dplyr и она в удобной форме выводит данные

my.frame <- data.frame(x = rnorm(10000), y = rnorm(10000), f = factor(rep(1:2,5000)))
my_frame <- data_frame(x = rnorm(10000), y = rnorm(10000), f = factor(rep(1:2,5000)))

Попробуем вытащить данные

my_frame # 10 значений выходит в консоли
diamonds <- as_data_frame(diamonds)
diamonds
# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.230 Ideal     E     SI2      61.5   55.   326  3.95  3.98  2.43
 2 0.210 Premium   E     SI1      59.8   61.   326  3.89  3.84  2.31
 3 0.230 Good      E     VS1      56.9   65.   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4   58.   334  4.20  4.23  2.63
 5 0.310 Good      J     SI2      63.3   58.   335  4.34  4.35  2.75
 6 0.240 Very Good J     VVS2     62.8   57.   336  3.94  3.96  2.48
 7 0.240 Very Good I     VVS1     62.3   57.   336  3.95  3.98  2.47
 8 0.260 Very Good H     SI1      61.9   55.   337  4.07  4.11  2.53
 9 0.220 Fair      E     VS2      65.1   61.   337  3.87  3.78  2.49
10 0.230 Very Good H     VS1      59.4   61.   338  4.00  4.05  2.39
# ... with 53,930 more rows

в data_frame можно сразу создать переменную и сразу же использовать её

my_data_2 <- data_frame(x = rnorm(10), y = abs(x))

Давайте разберём фнукцию select. Как мы помним ранее select() это выбрать столбцы

select(diamonds, cut, carat) # Выбираем два столбца из датасета diamonds
select(diamonds, cut:table) # от cut до table
select(diamonds, 1:3) 
select(diamonds, starts_with("c")) # выбрать те переменные которые начинаются с буквы "с""

Дополнительные функций select: select(iris, contains(“.”)) - выбирает столбцы, имя которых начинается со строки символов

  • select(iris, ends_with(“Length”)) - выбирает столбцы, имя которых заканчивается строкой символов
  • select(iris, everything()) - выбирает каждый столбец
  • select(iris, matches(“.t.”)) - выбирает столбцы, имя которых соответствует регулярному выражению
  • select(iris, num_range(“x”, 1: 5)) - выбирает столбцы с именами x1, x2, x3, x4, x5
  • select(iris, one_of(c(“Species”, “Genus”))) - выбирает столбцы по названию колонок
  • select(iris, starts_with(«Sepal»)) - выбирает столбцы, имя которых начинается с символьной строки
  • select (радуга, Sepal.Length: Petal.Width) - выбирает все столбцы между Sepal.Length и Petal.Width (включительно)
  • select(iris, -Species) - выбирает все столбцы, кроме Species

Давайте разберём фнукцию slice. Как мы помним ранее slice() это вытаскивать заданные колонки

slice(diamonds,1:10) # вытаскиваем с 1 по 10 колонку
## # A tibble: 10 x 10
##    carat cut       color clarity depth table price     x     y     z
##    <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
##  1 0.230 Ideal     E     SI2      61.5  55.0   326  3.95  3.98  2.43
##  2 0.210 Premium   E     SI1      59.8  61.0   326  3.89  3.84  2.31
##  3 0.230 Good      E     VS1      56.9  65.0   327  4.05  4.07  2.31
##  4 0.290 Premium   I     VS2      62.4  58.0   334  4.20  4.23  2.63
##  5 0.310 Good      J     SI2      63.3  58.0   335  4.34  4.35  2.75
##  6 0.240 Very Good J     VVS2     62.8  57.0   336  3.94  3.96  2.48
##  7 0.240 Very Good I     VVS1     62.3  57.0   336  3.95  3.98  2.47
##  8 0.260 Very Good H     SI1      61.9  55.0   337  4.07  4.11  2.53
##  9 0.220 Fair      E     VS2      65.1  61.0   337  3.87  3.78  2.49
## 10 0.230 Very Good H     VS1      59.4  61.0   338  4.00  4.05  2.39

filter() это выбрать данные по условию

filter(diamonds, carat > 0.3, color == "J") # фильтруме данные по условию carat и color
# A tibble: 2,735 x 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.310 Good      J     SI2      63.3   58.   335  4.34  4.35  2.75
 2 0.310 Ideal     J     SI2      62.2   54.   344  4.35  4.37  2.71
 3 0.310 Very Good J     SI1      59.4   62.   353  4.39  4.43  2.62
 4 0.310 Very Good J     SI1      58.1   62.   353  4.44  4.47  2.59
 5 0.330 Ideal     J     SI1      61.1   56.   403  4.49  4.55  2.76
 6 1.17  Very Good J     I1       60.2   61.  2774  6.83  6.90  4.13
 7 1.05  Very Good J     SI2      63.2   56.  2789  6.49  6.45  4.09
 8 1.05  Fair      J     SI2      65.8   59.  2789  6.41  6.27  4.18
 9 1.00  Premium   J     SI2      62.3   58.  2801  6.45  6.34  3.98
10 0.930 Premium   J     SI2      61.9   57.  2807  6.21  6.19  3.84
# ... with 2,725 more rows

arrange() это сортировать по убыванию или возрастанию

arrange(diamonds, price, depth) # сортировка по цене и по возможности по depth
# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.210 Premium   E     SI1      59.8   61.   326  3.89  3.84  2.31
 2 0.230 Ideal     E     SI2      61.5   55.   326  3.95  3.98  2.43
 3 0.230 Good      E     VS1      56.9   65.   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4   58.   334  4.20  4.23  2.63
 5 0.310 Good      J     SI2      63.3   58.   335  4.34  4.35  2.75
 6 0.240 Very Good I     VVS1     62.3   57.   336  3.95  3.98  2.47
 7 0.240 Very Good J     VVS2     62.8   57.   336  3.94  3.96  2.48
 8 0.260 Very Good H     SI1      61.9   55.   337  4.07  4.11  2.53
 9 0.220 Fair      E     VS2      65.1   61.   337  3.87  3.78  2.49
10 0.230 Very Good H     VS1      59.4   61.   338  4.00  4.05  2.39
# ... with 53,930 more rows
arrange(diamonds, desc(carat)) # сортировка по убыванию 
# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1  5.01 Fair      J     I1       65.5   59. 18018 10.7  10.5   6.98
 2  4.50 Fair      J     I1       65.8   58. 18531 10.2  10.2   6.72
 3  4.13 Fair      H     I1       64.8   61. 17329 10.0   9.85  6.43
 4  4.01 Premium   I     I1       61.0   61. 15223 10.1  10.1   6.17
 5  4.01 Premium   J     I1       62.5   62. 15223 10.0   9.94  6.24
 6  4.00 Very Good I     I1       63.3   58. 15984 10.0   9.94  6.31
 7  3.67 Premium   I     I1       62.4   56. 16193  9.86  9.81  6.13
 8  3.65 Fair      H     I1       67.1   53. 11668  9.53  9.48  6.38
 9  3.51 Premium   J     VS2      62.5   59. 18701  9.66  9.63  6.03
10  3.50 Ideal     H     I1       62.8   57. 12587  9.65  9.59  6.03
# ... with 53,930 more rows

rename() меняет название переменных в данных

rename(diamonds, new_cut = cut) # меняет название переменной
# A tibble: 53,940 x 10
   carat new_cut   color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.230 Ideal     E     SI2      61.5   55.   326  3.95  3.98  2.43
 2 0.210 Premium   E     SI1      59.8   61.   326  3.89  3.84  2.31
 3 0.230 Good      E     VS1      56.9   65.   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4   58.   334  4.20  4.23  2.63
 5 0.310 Good      J     SI2      63.3   58.   335  4.34  4.35  2.75
 6 0.240 Very Good J     VVS2     62.8   57.   336  3.94  3.96  2.48
 7 0.240 Very Good I     VVS1     62.3   57.   336  3.95  3.98  2.47
 8 0.260 Very Good H     SI1      61.9   55.   337  4.07  4.11  2.53
 9 0.220 Fair      E     VS2      65.1   61.   337  3.87  3.78  2.49
10 0.230 Very Good H     VS1      59.4   61.   338  4.00  4.05  2.39
# ... with 53,930 more rows

mutate() создаёт новую колонку применяя какое нибудь условие

m <- mutate(diamonds, sqrt_price = sqrt(price), log_carat = log(carat))
  • mutate_all() применяют функции ко всем (негрупповым) столбцам
  • mutate_at() позволяют вам выбирать столбцы на основе имени, как в select()
  • mutate_if() работает со столбцами по условию, для которых предикат возвращает TRUE

group_by() группирует столбец

# group_by() и summarise()
x <- group_by(diamonds, cut)

## если вытащить sample_n и slice то там выйдет по группированным данным
sample_n(x, 2)
# A tibble: 10 x 10
# Groups:   cut [5]
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.900 Fair      I     SI1      65.7   58.  2873  6.03  6.00  3.95
 2 0.760 Fair      D     SI2      55.5   69.  2518  6.16  6.07  3.39
 3 0.900 Good      G     VS2      64.9   61.  4124  5.91  5.99  3.86
 4 0.900 Good      E     VS2      64.2   59.  4315  6.02  6.10  3.89
 5 0.320 Very Good E     VS2      62.0   54.   702  4.37  4.41  2.72
 6 1.71  Very Good D     SI2      63.5   56. 11844  7.58  7.51  4.79
 7 1.01  Premium   D     SI2      62.6   60.  4338  6.40  6.37  4.00
 8 0.300 Premium   F     IF       61.6   58.  1085  4.34  4.30  2.66
 9 0.510 Ideal     G     VVS2     61.8   56.  1974  5.16  5.10  3.17
10 1.01  Ideal     E     VS2      61.5   57.  7421  6.48  6.44  3.97
slice(x, 1)
## # A tibble: 5 x 10
## # Groups:   cut [5]
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1 0.220 Fair      E     VS2      65.1  61.0   337  3.87  3.78  2.49
## 2 0.230 Good      E     VS1      56.9  65.0   327  4.05  4.07  2.31
## 3 0.240 Very Good J     VVS2     62.8  57.0   336  3.94  3.96  2.48
## 4 0.210 Premium   E     SI1      59.8  61.0   326  3.89  3.84  2.31
## 5 0.230 Ideal     E     SI2      61.5  55.0   326  3.95  3.98  2.43

ungroup() разгрупирует данные

ungroup(diamonds)
# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.230 Ideal     E     SI2      61.5   55.   326  3.95  3.98  2.43
 2 0.210 Premium   E     SI1      59.8   61.   326  3.89  3.84  2.31
 3 0.230 Good      E     VS1      56.9   65.   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4   58.   334  4.20  4.23  2.63
 5 0.310 Good      J     SI2      63.3   58.   335  4.34  4.35  2.75
 6 0.240 Very Good J     VVS2     62.8   57.   336  3.94  3.96  2.48
 7 0.240 Very Good I     VVS1     62.3   57.   336  3.95  3.98  2.47
 8 0.260 Very Good H     SI1      61.9   55.   337  4.07  4.11  2.53
 9 0.220 Fair      E     VS2      65.1   61.   337  3.87  3.78  2.49
10 0.230 Very Good H     VS1      59.4   61.   338  4.00  4.05  2.39
# ... with 53,930 more rows
slice(x, 1)
## # A tibble: 5 x 10
## # Groups:   cut [5]
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1 0.220 Fair      E     VS2      65.1  61.0   337  3.87  3.78  2.49
## 2 0.230 Good      E     VS1      56.9  65.0   327  4.05  4.07  2.31
## 3 0.240 Very Good J     VVS2     62.8  57.0   336  3.94  3.96  2.48
## 4 0.210 Premium   E     SI1      59.8  61.0   326  3.89  3.84  2.31
## 5 0.230 Ideal     E     SI2      61.5  55.0   326  3.95  3.98  2.43

ungroup() разгрупирует данные

ungroup(diamonds)
# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.230 Ideal     E     SI2      61.5   55.   326  3.95  3.98  2.43
 2 0.210 Premium   E     SI1      59.8   61.   326  3.89  3.84  2.31
 3 0.230 Good      E     VS1      56.9   65.   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4   58.   334  4.20  4.23  2.63
 5 0.310 Good      J     SI2      63.3   58.   335  4.34  4.35  2.75
 6 0.240 Very Good J     VVS2     62.8   57.   336  3.94  3.96  2.48
 7 0.240 Very Good I     VVS1     62.3   57.   336  3.95  3.98  2.47
 8 0.260 Very Good H     SI1      61.9   55.   337  4.07  4.11  2.53
 9 0.220 Fair      E     VS2      65.1   61.   337  3.87  3.78  2.49
10 0.230 Very Good H     VS1      59.4   61.   338  4.00  4.05  2.39
# ... with 53,930 more rows

summarise_each(iris, funs(mean)) - Применить итоговую функцию к каждому столбцу

Пайпинг крайне полезная функция, помогает каждый раз не писать входные данные в этом коде мы выбрали данные diamonds и передали их select что бы он отобрал 3 переменные: cut, carat и price. Затем группируем их по переменной price и меняем название колонки на “Tsena”

# Ctr+shift+m создаёт %>%(пайпинг)
xc <- diamonds %>% select(cut, carat, price) %>% group_by(price) %>% rename("Tsena" = price)

count(iris, Species, wt = Sepal.Length) - показывает какое кол-во уникальных значений

count(diamonds, cut)
# дополнение wt = price, делает суммирование по цене
count(diamonds, cut, wt = price)

Функции объединения данных

  • left_join(a, b, by = “x1”) - присоединение соответсвующих строк от b до a
  • right_join(a, b, by = “x1”) - присоединение соответсвующих строк от a до b
  • inner_join(a, b, by = “x1”) - присоединение данных. Сохранение только строк в обоих наборах
  • full_join(a, b, by = “x1”) - присоединение данных. Сохранение всех значений и всех строк

  • bind_rows(y, z) - добавляет таблицу z в y как новые строки
  • bind_cols(y, z) - добавляет z в y как новые столбцы

Дополнительные функций dplyr:

  • glimpse() информация о данных, функция очень похожа на str()
  • distinct() удаление повторяющихся строк
  • sample_frac() случайная выборка доли строк
  • top_n() Выберите первые n записей (по группам, если сгруппированы данные)

purrr

Column

purrr

Библиотека purrr

install.packages(“purrr”)

library(purrr)

Начну с того, что сложно было найти Чит-щит (щит от англ. sheet, а не shit, то бишь лист и не для shit) на телефоне, но прийдя на работу нашел быстро link. Наверное, извините, Сенсей, если не прав буду, эту библиотеку мы будем применять для объединения функций для вычисления и работы с преобразованием и трансформацией столбцов и строк.

Давайте посмотрим встроенное описание:

?purrr
## starting httpd help server ... done

Там только ссылки, ну ок.

Функции map

Функции map, аналогичны стандартным функциям Apply, они применяют функцию (Вашу) итеративно к каждому элементу списка или вектора:

  1. map(данные, функция, …), к каждому элементу применится функция, которую Вы записали
data(mtcars)
map(mtcars, function(x){is.na(x)})
$mpg
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$cyl
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$disp
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$hp
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$drat
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$wt
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$qsec
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$vs
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$am
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$gear
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$carb
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  1. map2(x,y, функция) - позволяет, также как map, итеративно применить функцию к каждому элементу, только здесь можно применять к нескольким столбцам или векторам одинакового размера:
x <- list(1, 10, 100)
y <- list(1, 2, 3)
z <- list(5, 50, 500)
map2(x, y, `+`)
[[1]]
[1] 2

[[2]]
[1] 12

[[3]]
[1] 103
  1. pmap(x,y,z, функция) - как map2, только функцию можно применить к группе элементов:
x <- list(1, 10, 100)
y <- list(1, 2, 3)
z <- list(5, 50, 500)
pmap(list(x,y,z), sum)
[[1]]
[1] 7

[[2]]
[1] 62

[[3]]
[1] 603

4.Самая “жесткая” функция этой области invoke_map(функция1, функция2, функция3, данные,). Применяет несколько функций:

list(m1 = mean, m2 = median) %>% invoke_map(x = 1:100)
$m1
[1] 50.5

$m2
[1] 50.5
#ИЛИ

l <- list(mean,sd)
invoke_map(l,x=1:200)
[[1]]
[1] 100.5

[[2]]
[1] 57.87918
#ИЛИ ближе к нашему делу

t <- list(function(x){sum(x)},function(x){mean(x)})
invoke_map(t,x=1:300)
[[1]]
[1] 45150

[[2]]
[1] 150.5

Фильтрация

Ща буду торопиться, т.к. не успеваю до урока подготовиться:

  1. pluck - выбор элементов по имени, звучит как, pluck(x, атрибут,)
obj1 <- list("a", list(1, elt = "Method"))
obj1
[[1]]
[1] "a"

[[2]]
[[2]][[1]]
[1] 1

[[2]]$elt
[1] "Method"
obj2 <- list("b", list(2, elt = "NeMethod"))
obj2
[[1]]
[1] "b"

[[2]]
[[2]][[1]]
[1] 2

[[2]]$elt
[1] "NeMethod"
x <- list(obj1, obj2)
my_element <- function(x) x[[2]]$elt
pluck(x, 1, my_element)
[1] "Method"
pluck(x, 2, my_element)
[1] "NeMethod"
  1. keep - оставить/выбрать элементы согласно условию, как keep(x, условие)
rep(10, 10) %>%
  map(sample, 5) %>%
  keep(function(x) mean(x) > 6)
[[1]]
[1] 10  8  4  7  6

[[2]]
[1]  1  8  9 10  4

[[3]]
[1]  1  6  7 10  8
  1. discard - не оставлять/не выбирать элементы, которые не проходят по заданному условию, как discard(x, условие)
x <- rerun(5, a = rbernoulli(1), b = sample(10))
x
[[1]]
[[1]]$a
[1] TRUE

[[1]]$b
 [1]  8  9  1  2 10  3  5  6  4  7


[[2]]
[[2]]$a
[1] TRUE

[[2]]$b
 [1]  3  2  5  7  4 10  1  8  6  9


[[3]]
[[3]]$a
[1] FALSE

[[3]]$b
 [1]  1  5 10  3  8  4  9  2  7  6


[[4]]
[[4]]$a
[1] FALSE

[[4]]$b
 [1]  8  4  5  7  6  1  2  3  9 10


[[5]]
[[5]]$a
[1] FALSE

[[5]]$b
 [1]  8  5 10  3  1  2  9  7  4  6
x %>% keep("a")
[[1]]
[[1]]$a
[1] TRUE

[[1]]$b
 [1]  8  9  1  2 10  3  5  6  4  7


[[2]]
[[2]]$a
[1] TRUE

[[2]]$b
 [1]  3  2  5  7  4 10  1  8  6  9
x %>% discard("a")
[[1]]
[[1]]$a
[1] FALSE

[[1]]$b
 [1]  1  5 10  3  8  4  9  2  7  6


[[2]]
[[2]]$a
[1] FALSE

[[2]]$b
 [1]  8  4  5  7  6  1  2  3  9 10


[[3]]
[[3]]$a
[1] FALSE

[[3]]$b
 [1]  8  5 10  3  1  2  9  7  4  6
  1. compact - удалить NA-элементы (пустые значения), compact(x)

  2. head_while - возвращать элементы, пока не случится условие, к примеру, head_while(x,is.character) - будут возвращаться значения Х, пока они в формате character.

pos <- function(x) x >= 0
head_while(5:-5, pos)
[1] 5 4 3 2 1 0
tail_while(5:-5, negate(pos))
[1] -1 -2 -3 -4 -5
big <- function(x) x > 100
head_while(0:10, big)
integer(0)
tail_while(0:10, big)
integer(0)

Суммирование

  1. every - выбор всех элементов по условию, например every(x, is.character) - выбор всех Х, формата character
y <- list(0:10, 5.5)
y %>% every(is.numeric)
[1] TRUE
y %>% every(is.integer)
[1] FALSE
#ИЛИ

x <- list(0, 1, TRUE)
x %>% every(identity)
[1] TRUE
  1. some - выбор некоторых элементов по условию, например some(x, is.numeric) - выбор оставшихся Х, формата numeric
x <- list(0, 1, TRUE)
x %>% some(identity)
[1] TRUE
  1. has_element - как pluck в фильтрации, только возвращает он логический ответ - ТРУ, еее мэн, или ФОЛСЕ. Содержится ли данный элемент в таблице, листе и др. has_element(x, “описание элемента”)
x <- list(1:10, 5, 9.9)
x %>% has_element(1:10)
[1] TRUE
x %>% has_element(3)
[1] FALSE
  1. detect - типа дно детектед (обнаружен), грубо, детектор какого либо элемента по условию. detect(x, условие)

  2. detect_index - тоже, что и detect, только возвращает индекс элемента

x <- list(
  list(1, foo = FALSE),
  list(2, foo = TRUE),
  list(3, foo = TRUE)
)

detect(x, "foo")
[[1]]
[1] 2

$foo
[1] TRUE
detect_index(x, "foo")
[1] 2
vec_depth - возвращает информацию о векторе, количество уровней индексов, глубина вектора, по пацански обзывается. vec_depth(x)
x <- list(
  list(),
  list(list()),
  list(list(list(1)))
)
vec_depth(x)
[1] 5
x %>% map_int(vec_depth)
[1] 1 2 4

Трансформация

  1. modify - применить функцию к каждому элементу. modify(x,функция)
#Типа mutate
data("iris")
str(iris)
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
iris %>%
  modify_if(is.factor, as.character) %>%
  str()
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : chr  "setosa" "setosa" "setosa" "setosa" ...
  1. modify_at - применить функцию только к тем значениям, к которым вы хотите, но хотелку надо указать. modify_at(x,че хотите,функция)

  2. modify_if - применить функцию только к тем значениям, которые проходят по условию, которому вы хотите. Насчет хотелки не повторяюсь. modify_if(x,хотелка,функция)

4.modify_depth - применить функцию к определенной глубине вектора, до определенного уровня типа. modify_depth(х, глубина, функция)

Придание новой формы листу (reshape), не, не диета.

  1. flatten(x) - удаление уровней индексов из листа. Все запихает в колонку. Если, к примеру, у вас было булочек - 5, яблок - 10 и ботинок - 2, то flatten, удалит булочки, яблоки и ботинки, оставит значения (5,10,2). Ну, вспоминаем объяснения Сенсея по Convolutional Neural Networks. (Элемент Convulved Layer - Flattening)
x <- rerun(2, sample(4))
x
[[1]]
[1] 2 4 3 1

[[2]]
[1] 2 4 3 1
x %>% flatten()
[[1]]
[1] 2

[[2]]
[1] 4

[[3]]
[1] 3

[[4]]
[1] 1

[[5]]
[1] 2

[[6]]
[1] 4

[[7]]
[1] 3

[[8]]
[1] 1
x %>% flatten_int()
[1] 2 4 3 1 2 4 3 1
  1. transpose(x) - транспонирование, превращает в многоуровневый список.
x <- rerun(5, x = runif(1), y = runif(5))
x %>% str()
List of 5
 $ :List of 2
  ..$ x: num 0.135
  ..$ y: num [1:5] 0.512 0.909 0.959 0.941 0.251
 $ :List of 2
  ..$ x: num 0.561
  ..$ y: num [1:5] 0.377 0.064 0.66 0.228 0.42
 $ :List of 2
  ..$ x: num 0.625
  ..$ y: num [1:5] 0.705 0.339 0.972 0.719 0.285
 $ :List of 2
  ..$ x: num 0.809
  ..$ y: num [1:5] 0.667 0.532 0.674 0.142 0.908
 $ :List of 2
  ..$ x: num 0.63
  ..$ y: num [1:5] 0.7622 0.939 0.1776 0.0287 0.6363
x %>% transpose() %>% str()
List of 2
 $ x:List of 5
  ..$ : num 0.135
  ..$ : num 0.561
  ..$ : num 0.625
  ..$ : num 0.809
  ..$ : num 0.63
 $ y:List of 5
  ..$ : num [1:5] 0.512 0.909 0.959 0.941 0.251
  ..$ : num [1:5] 0.377 0.064 0.66 0.228 0.42
  ..$ : num [1:5] 0.705 0.339 0.972 0.719 0.285
  ..$ : num [1:5] 0.667 0.532 0.674 0.142 0.908
  ..$ : num [1:5] 0.7622 0.939 0.1776 0.0287 0.6363

Присоединение к списку (dplyr - лучше, кажется, хотя здесь чуть иначе)

  1. append(x,значения, after = после номера в списке) - добавляет значения в конец списка
append(1:5, 0:1, after = 3)
[1] 1 2 3 0 1 4 5
  1. prepend(x, значения, before = номер в списке) - append наоборот
prepend(1:5, 0:1, before = 1)
[1] 0 1 1 2 3 4 5
  1. splice(x,y,“некое описание”) - объединить объектыв список, сохраняющий объекты S3 в качестве подписок
inputs <- list(arg1 = "a", arg2 = "b")
splice(inputs, arg3 = c("c1", "c2")) %>% str()
List of 3
 $ arg1: chr "a"
 $ arg2: chr "b"
 $ arg3: chr [1:2] "c1" "c2"
list(inputs, arg3 = c("c1", "c2")) %>% str()
List of 2
 $     :List of 2
  ..$ arg1: chr "a"
  ..$ arg2: chr "b"
 $ arg3: chr [1:2] "c1" "c2"
c(inputs, arg3 = c("c1", "c2")) %>% str()
List of 4
 $ arg1 : chr "a"
 $ arg2 : chr "b"
 $ arg31: chr "c1"
 $ arg32: chr "c2"

Работа с Lists (вышеуказанные листы и списки, спасибо гугл транслейт)

  1. array_tree(массив, margin = “…”) - магия, массив переводим в список
x <- array(1:12, c(2, 2, 3))
x
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

, , 3

     [,1] [,2]
[1,]    9   11
[2,]   10   12
array_tree(x) %>% str()
List of 2
 $ :List of 2
  ..$ :List of 3
  .. ..$ : int 1
  .. ..$ : int 5
  .. ..$ : int 9
  ..$ :List of 3
  .. ..$ : int 3
  .. ..$ : int 7
  .. ..$ : int 11
 $ :List of 2
  ..$ :List of 3
  .. ..$ : int 2
  .. ..$ : int 6
  .. ..$ : int 10
  ..$ :List of 3
  .. ..$ : int 4
  .. ..$ : int 8
  .. ..$ : int 12
  1. cross2(x,y) - крутая штука, все комбинации х и у. Есть еще cross3 и cross_df
data <- list(
  id = c("John", "Jane"),
  greeting = c("Hello.", "Bonjour."),
  sep = c("! ", "... ")
)
data
$id
[1] "John" "Jane"

$greeting
[1] "Hello."   "Bonjour."

$sep
[1] "! "   "... "
args <- data %>% cross_df()
args
# A tibble: 8 x 3
 sep   id   sep   greeting
 sep   <chr>sep   <chr>   
1"! "  John "! "  Hello.  
2"! "  Jane "! "  Hello.  
3"! "  John "! "  Bonjour.
4"! "  Jane "! "  Bonjour.
5"! "  John "! "  Hello.  
6"! "  Jane "! "  Hello.  
7"! "  John "! "  Bonjour.
8"! "  Jane "! "  Bonjour.
  1. set_names(x,…, имена) - присвоить имена вектору или списку
set_names(1:4, c("a", "b", "c", "d"))
a b c d 
1 2 3 4 
Уменьшение Lists

1)reduce(x,что-либо) - уменьшение списка, рекурсивно, путем применения функции к каждому элементу. Например: reduce(x,sum)

1:3 %>% reduce(`+`)
[1] 6
1:10 %>% reduce(`*`)
[1] 3628800
  1. accumulate(x,что-либо) - уменьшить и вернуть промежуточные результаты. Пример: accumulate(x,sum)
1:3 %>% accumulate(`+`)
[1] 1 3 6

Модификация функций

  1. compose() - компоновать несколько функций
not_null <- compose(`!`, is.null)
  1. lift() - Изменить тип вводных данных функций
x <- list(x = c(1:100, NA, 1000), na.rm = TRUE, trim = 0.9)
lift_dl(mean)(x)
[1] 51
  1. rerun() - Перезапуск выражений на эннное количество раз
#Видели 1к раз выше, ну ладно:
10 %>% rerun(rnorm(5))
[[1]]
[1] -0.30345142  0.05186067  0.28011235 -1.20547940  0.21458187

[[2]]
[1]  0.48894985 -0.85992519 -0.71198861  0.08085422 -1.58673473

[[3]]
[1] -0.6017978 -0.1479132 -0.5942114  2.0270479  0.7352158

[[4]]
[1]  1.3820602 -0.8773581  1.1302845  0.2946867 -0.5310896

[[5]]
[1] -0.3762470 -0.9146927 -0.3964334 -1.9948261 -0.7681583

[[6]]
[1]  0.7005356 -1.6918596 -1.0060063 -0.8200729 -0.4711455

[[7]]
[1]  0.3680191 -0.9415149 -0.3078407 -1.2385472 -0.5908439

[[8]]
[1]  0.3426692  0.1723188  1.7485898 -0.6325711 -2.4096723

[[9]]
[1]  0.4126421  0.1691946 -0.1652832 -0.5863225 -1.4244580

[[10]]
[1]  0.05700923  0.39522105 -0.43854893 -0.23787137 -0.21427156
  1. negate() - отменить предикатную функцию
negate("x")
function (x, ...) 
{
    !pluck(x, list("x"), .default = NULL)
}
<environment: 0x7f83abb4edf0>
negate(is.null)
function (x) 
{
    !is.null(x = x)
}
<environment: base>
negate(~ .x > 0)
function (..., .x = ..1, .y = ..2, . = ..1) 
{
    !.x > 0
}
  1. partial() - создание версии функции, которая имеет некоторые аргументы для того чтобы их увидить
#EASY Варик:
compact1 <- function(x) discard(x, is.null)
#Partial
compact2 <- partial(discard, .p = is.null)
  1. safely() - модифицировать функцию, дабы вернуть как результаты, так и ошибки
safe_log <- safely(log)
safe_log(10)
$result
[1] 2.302585

$error
NULL
safe_log("a")
$result
NULL

$error
<simpleError in log(x = x, base = base): non-numeric argument to mathematical function>
list("a", 10, 100) %>%
  map(safe_log) %>%
  transpose()
$result
$result[[1]]
NULL

$result[[2]]
[1] 2.302585

$result[[3]]
[1] 4.60517


$error
$error[[1]]
<simpleError in log(x = x, base = base): non-numeric argument to mathematical function>

$error[[2]]
NULL

$error[[3]]
NULL
  1. quietly() - safely + warnings и messages и outputs

  2. possibly() - возвращает значение по умолчанию, когда происходит ошибка

Nested Data - вложенные данные

Ваще здесь жесткач, сам до конца еще не догнал, но постараюсь расписать: Записывается как nest(data), в результате которой Вложенные хранилища данных хранятся отдельные таблицы в пределах ячейки более крупной, организованной Таблица - это версия гугл транслейта. Кароч, nest вкладывает в одну ячейку данные более крупной таблицы. Функция отмены - unnest(data)

library(tidyr)
(iris) %>% nest(-Species)
     Species
1     setosa
2 versicolor
3  virginica
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    data
1 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5.0, 5.0, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5.0, 5.5, 4.9, 4.4, 5.1, 5.0, 4.5, 4.4, 5.0, 5.1, 4.8, 5.1, 4.6, 5.3, 5.0, 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3.0, 3.0, 4.0, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3.0, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3.0, 3.4, 3.5, 2.3, 3.2, 3.5, 3.8, 3.0, 3.8, 3.2, 3.7, 3.3, 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1.0, 1.7, 1.9, 1.6, 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 1.3, 1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2
2 7.0, 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5.0, 5.9, 6.0, 6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6.0, 5.7, 5.5, 5.5, 5.8, 6.0, 5.4, 6.0, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, 5.8, 5.0, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7, 3.2, 3.2, 3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2.0, 3.0, 2.2, 2.9, 2.9, 3.1, 3.0, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3.0, 2.8, 3.0, 2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3.0, 3.4, 3.1, 2.3, 3.0, 2.5, 2.6, 3.0, 2.6, 2.3, 2.7, 3.0, 2.9, 2.9, 2.5, 2.8, 4.7, 4.5, 4.9, 4.0, 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 4.2, 4.0, 4.7, 3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4.0, 4.9, 4.7, 4.3, 4.4, 4.8, 5.0, 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5, 4.7, 4.4, 4.1, 4.0, 4.4, 4.6, 4.0, 3.3, 4.2, 4.2, 4.2, 4.3, 3.0, 4.1, 1.4, 1.5, 1.5, 1.3, 1.5, 1.3, 1.6, 1.0, 1.3, 1.4, 1.0, 1.5, 1.0, 1.4, 1.3, 1.4, 1.5, 1.0, 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, 1.5, 1.0, 1.1, 1.0, 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.4, 1.2, 1.0, 1.3, 1.2, 1.3, 1.3, 1.1, 1.3
3 6.3, 5.8, 7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, 7.7, 6.0, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6.0, 6.9, 6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9, 3.3, 2.7, 3.0, 2.9, 3.0, 3.0, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3.0, 2.5, 2.8, 3.2, 3.0, 3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3.0, 2.8, 3.0, 2.8, 3.8, 2.8, 2.8, 2.6, 3.0, 3.4, 3.1, 3.0, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3.0, 2.5, 3.0, 3.4, 3.0, 6.0, 5.1, 5.9, 5.6, 5.8, 6.6, 4.5, 6.3, 5.8, 6.1, 5.1, 5.3, 5.5, 5.0, 5.1, 5.3, 5.5, 6.7, 6.9, 5.0, 5.7, 4.9, 6.7, 4.9, 5.7, 6.0, 4.8, 4.9, 5.6, 5.8, 6.1, 6.4, 5.6, 5.1, 5.6, 6.1, 5.6, 5.5, 4.8, 5.4, 5.6, 5.1, 5.1, 5.9, 5.7, 5.2, 5.0, 5.2, 5.4, 5.1, 2.5, 1.9, 2.1, 1.8, 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2.0, 1.9, 2.1, 2.0, 2.4, 2.3, 1.8, 2.2, 2.3, 1.5, 2.3, 2.0, 2.0, 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6, 1.9, 2.0, 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 1.9, 2.3, 2.5, 2.3, 1.9, 2.0, 2.3, 1.8

Думаю пока все. Еще буду дополнять, если чего еще узнаю. Всем хорошего вечера!

All rights reserved

stringr

Column

stringr

Шпаргалка по библиотеке stringr

При работе с текставыми данными, часто бывает необходимость очистки и подготовки их. stringr предоставляет нам ряд замечательных функций, предназначенных для максимально простой работы со строками. Всю информацию по данной библиотеке можно посмотреть по ссылке Link. С помощью данного пакета можно определять совпадения в тексте, считать количество символов, осуществлять выборку по заданному критерию, выбирать длину выражения или слов, изменять и заменять данные, разделять и объединять, менять порядок связей.

Разберем возможности библиотреки stringr на практике.

  1. Для начала обратимся к библиотеке, чтобы была возможность пользоваться её функциями:
library(stringr)

Все функции в stringr начинаются с str_ и берут вектор строк в качестве первого аргумента. Создаем вектор из некоторых слов. И следующим действием посчитаем сколько символов в каждом слове:

x <- c("why", "video", "cross", "extra", "deal", "authority")
str_length(x) 
[1] 3 5 5 5 4 9

Объединим вектор в одну строку через запятую:

str_c(x, collapse = ", ")
[1] "why, video, cross, extra, deal, authority"

Извлечем из каждого слова первые две буквы:

str_sub(x, 1, 2)
[1] "wh" "vi" "cr" "ex" "de" "au"

Большинство строковых функций работают с регулярными выражениями. Например, регулярное выражение «[aeiou]» соответствует любому одиночному символу, который является гласным.

Существуют основные операций, которые работают с шаблонами:

• str_detect (x, pattern) - сообщает, есть ли соответствие шаблону:

str_detect (x, "[aeiou]")
[1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

• str_count (x, pattern) - подсчитывает количество шаблонов:

str_count (x, "[aeiou]")
[1] 0 3 1 2 2 4

• str_subset (x, pattern) - извлекает соответствующие компоненты:

str_subset (x, "[aeiou]")
[1] "video"     "cross"     "extra"     "deal"      "authority"

• str_locate (x, pattern) задает позицию совпадения:

str_locate (x, "[aeiou]")
     start end
[1,]    NA  NA
[2,]     2   2
[3,]     3   3
[4,]     1   1
[5,]     2   2
[6,]     1   1

• str_extract (x, pattern) - извлекает текст совпадения:

str_extract (x, "[aeiou]")
[1] NA  "i" "o" "e" "e" "a"

• str_match (x, pattern) - извлекает части совпадения, определенные скобками:

# извлекать символы с обеих сторон гласного
str_match(x, "(.)[aeiou](.)")
     [,1]  [,2] [,3]
[1,] NA    NA   NA  
[2,] "vid" "v"  "d" 
[3,] "ros" "r"  "s" 
[4,] NA    NA   NA  
[5,] "dea" "d"  "a" 
[6,] "aut" "a"  "t" 

• str_replace (x, pattern, replacement) - заменяет совпадения новым текстом:

str_replace (x, "[aeiou]", "?")
[1] "why"       "v?deo"     "cr?ss"     "?xtra"     "d?al"      "?uthority"

• str_split (x, pattern) - разбивает строку на несколько частей:

str_split(c("a,b", "c,d,e"), ",")
[[1]]
[1] "a" "b"

[[2]]
[1] "c" "d" "e"

Также мы можем использовать и другие опереции данной библиоттеки:

• str_which(string, pattern) - строки, содержащие совпадение шаблонов:

str_which(x, "[aeiou]")
[1] 2 3 4 5 6

• str_trunc(string, width, side = c(“right”, “left”,“center”), ellipsis = “…”) - усечение ширины строки, заменяя содержимое на многоточие.

str_trunc(x,4)
[1] "why"  "v..." "c..." "e..." "deal" "a..."

• str_sub() <- value - заменить подстроки извлеченных данных и присваивая результаты:

str_sub(x,2,2) <- "st"

• str_replace_all(string, pattern, replacement) - заменить все согласованные шаблоны в каждой строке:

str_replace_all(x, "a", "-")
[1] "wsty"       "vstdeo"     "cstoss"     "esttr-"     "dst-l"     
[6] "-stthority"

• str_to_lower(string, locale = “en”) - преобразование строки в нижний регистр (строчные буквы).

• str_to_upper(string, locale = “en”) - преобразование строки в верхний регистр (прописные буквы).

• str_to_title(string, locale = “en”) - преобразование первой буквы в прописную, для зоголовка:

str_to_title(x)
[1] "Wsty"       "Vstdeo"     "Cstoss"     "Esttra"     "Dstal"     
[6] "Astthority"

• str_pad(string, width, side = c(“left”, “right”, “both”), pad = " “) - регулировка ширины столбца.

• str_trim(string, side = c(“both”, “left”, “right”)) - орезать пробелы с начала и/или конца.

• str_dup(string, times) - повторять строки заданное количество раз:

[1] "wstywstywsty"                   "vstdeovstdeovstdeo"            
[3] "cstosscstosscstoss"             "esttraesttraesttra"            
[5] "dstaldstaldstal"                "astthorityastthorityastthority"

• str_split_fixed(string, pattern, n) - разделить вектор строку в матрицу подстрок.

• str_glue(…, .sep = “”, .envir = parent.frame()) - создание строки из строк и выражений.

• str_glue_data(.x, …, .sep = “”, .envir = parent.frame(), .na = “NA”) - используя датафрейм, список создание строки из строк и выражений.

• str_order(x, decreasing = FALSE, na_last = TRUE, locale = “en”, numeric = FALSE, …) - сортировка и вывод количественного значения данных вектора:

str_order(x)
[1] 6 3 5 4 2 1

• str_sort(x, decreasing = FALSE, na_last = TRUE, locale = “en”, numeric = FALSE, …) - сортировка вектора:

str_sort(x,decreasing = TRUE)
[1] "wsty"       "vstdeo"     "esttra"     "dstal"      "cstoss"    
[6] "astthority"

ggplot2

Column

ggplot2

Шпаргалка по библиотеке ggplot2 для визуализации данных в R.

library(ggplot2)

В примерах мы будем использовать встроенные данные mtcars и mpg.

1. Самый быстрый способ построить график - использовать функцию qplot. (a) Можно изменить цвет точек на графике по количеству цилиндров (cyl).

library(ggplot2)
data("mtcars")
mtcars$cyl <- as.factor(mtcars$cyl)
qplot(mtcars$mpg, mtcars$disp, mtcars, color=mtcars$cyl)

Output graph

2. Построить быструю гистограмму.

(а) в этом графике binwidth=ширина столбца, fill=цвет внутри графика.

  1. Также можно задать оси координат - xlab, ylab
qplot(mtcars$mpg, fill = mtcars$cyl, binwidth = 2)

Output graph

3. Функция ggplot позволяет составлять графики, добавляя слой за слоем для получения желаемого результата.

Основные элементы:

data=данные

aes=визуальная схема

geom=геометрический объект

stat=статистическая трансформация

scale=шкала

coordinate=система координат

position adjustments=регулировка позиции

facets= панели.

  • Вы задаете разные составляющие графика, и добавляете их друг к другу через “+”. Выглядит код вот так:

*ggplot(data = <набор данных>, aes(x = <переменная для оси X>, y = <переменная для оси Y>) + geom_<тип геометрического объекта>( aes(<специфические визуальные свойства геом. объекта>), stat = <тип статистического преобразования>, position = <функция для регулировки позиции объектов> … ) + stat_<функция для статистического преобразования> + coordinate_<система координат> + scale_<функция для контроля визуальной разметки> + theme_<тема для графика> + facet_<функция панелирования>

На английском: *ggplot(data = ) + (mapping = aes( ), stat = , position = ) + + + +

ggplot(mtcars, aes(mpg, disp)) +
geom_point(aes(color = carb), size = 2.5, alpha = 0.8)

Output graph

4. Добавление слоёв c геометрическими объектами (geom) на график.

Как только произведена базовая настройка, вы можете добавлять на график слои с геометрическими объектами друг за другом. Геометрические объекты — маркеры, которые мы помещаем на график, например:**

Одна переменная:

  • geom_density() #alpha=n - прозрачность

  • geom_dotplot()

  • geom_histogram() для гистрограмм

  • geom_bar() для столбиковых диаграмм

Две переменные:

  • geom_point() для диаграмм рассеивания, они же scatterplot

  • geom_line() для временных рядов (линии)

  • geom_text() для текстовых аннотаций

  • geom_boxplot()

  • geom_violin()

  • geom_dotplot()

ggplot(mtcars, aes(mpg,disp))+geom_point(aes(colour=cyl, size = qsec))

Output graph

2

ggplot(mtcars, aes(mpg))+geom_density(aes(fill=cyl), alpha=0.5)

Output graph2

3

ggplot(mtcars, aes(mpg, disp, group=cyl))+geom_boxplot(varwidth=T)

Output graph3

4

ggplot(data=mpg, aes(manufacturer)) + geom_bar(aes(fill=class), width = 0.5)+
theme(axis.text.x = element_text(angle=65)) #регулируем подписи к столбикам, angle-наклона текста

Output graph3

5. Статистические преобразования (stats)

Scatterplot не требует никаких преобразований, тк каждая точка получает координаты x и y и наносится на график в соответствии с их оригинальными значениями. НО эта функция будет полезна для гистограмм и диаграмм размахов. Отображение статистически преобразованной переменной: измените значение по умолчанию в геометрии: geom_bar(stat=“count”). Стандартный геометрический объект для stat_bin - это geom_bar.

6. Основные настройки внешнего вида (position)

Настраивает каким образом геометрические объекты расположены относительно друг друга.

  • identity - позиция по умолчанию в большинстве случаев. Геометрические объекты наносятся на график в соответствии с их фактическими значениями x и y

  • jitter:geom_point(position=“jitter”) - добавляет случайный шум к позициям x или y. Используется, как правило, для точек.

  • stack: geom_bar(position=“stack”)- складывает геометрические объекты друг на друга. Позиция по умолчанию для столбиковых диаграмм.

  • dodge:geom_bar(position=“dodge”) - выстраивает объекты в ряд слева и справа друг от друга.

  • fill: geom_bar(position=“fill”) - складывает объекты друг на друга расширяя или сужая их таким образом, чтобы заполнить пространство от 0 до 1. Позиция удобна для отображения пропорций *color=“black” это контур столбцов.

data(mpg)
ggplot(mpg, aes(fl, fill = drv))+geom_bar(position = "dodge", color="black")

Output graph1

2

ggplot(mpg, aes(fl, fill = drv))+geom_bar(position = "stack", color="black")

Output graph2

3

ggplot(mpg, aes(fl, fill = drv, ))+geom_bar(position = "fill", color="black")

Output graph3

7. Системы координат (coord).

Углубленно мы не изучали эту функцию ggplot. Будет полезна для построения круговых диаграмм.

pie <- ggplot(mtcars, aes("", fill = cyl)) +
  geom_bar(position = "fill", color = "black")+
  coord_polar(theta = "y") # Переменная theta определяет угловые координаты
  pie

Output graph

8. Панели (facets)

Разбивает на подграфики. Есть два способа разбиения:

  • facet_wrap() определяет подмножества как уровни одной группирующей переменной
  • facet_grid() определяет подмножества как пересечение двух группирующих переменных
ggplot(mpg, aes(cty, hwy)) + geom_point()+facet_grid(year~.) #Панель разбита по годам

Output graph1

2

ggplot(mpg, aes(cty, hwy)) + geom_point()+facet_grid(.~fl) #Разбивает на панели по переменной fl

Output graph2

9. Метки (Labs), цвет и заливка (функция scale).

Labs добавляют заголовок и названия для осей координат: - title - заголовок - subtitle -подзаголовок - caption - подпись под графиком.

Функция scale_color_continuous имеет аргументы low и high , чтобы задать цвет на верхней и нижней границах шкалы.

Варианты:

  • scale_colour_continuous()
  • scale_colour_gradient() - с градиентом
  • scale_colour_brewer() - можно выбрать палетку цветов, например “Spectral”
ggplot(mpg, aes(displ)) + scale_fill_brewer(palette = "Spectral")+
  geom_histogram(aes(fill=class), 
                   binwidth = 0.1, 
                   col="black", 
                   size=.1) +  #меняем binwidth
  labs(title="Histogram with Auto Binning", subtitle="Engine Displacement across Vehicle Classes")

Output graph

10. Сохранение графика в файл.

Можно сохранить график использую клавишу Export в RStudio или команду ggsave

Далее:

Xgboost

Column

Xgboost

Cheatsheet по библиотеке XGBOOST

**ibrary(xgboost)**

  1. Загрузить библиотеку

можно либо через install.packages(‘xgboost’), либо загрузить еженедельно обновляемую версию с репозитория. Пользователям Windows нужно сначала установить RTools.

  1. О чем эта песня?

XGBOOST - библиотека, разработанная и оптимизированная под бустинг алгоритмов деревьев. Ключевой алгоритм xgboost по сути является продолжением классического gbm алгоритма, только в 10 раз быстрее. Используя многопоточность и применяя регуляризацию, xgboost способен использовать б`ольшие вычислительной мощности и делать более точный прогноз. Многократный победитель kaggle соревнований.

Немного теории

  1. Особенности модели

Идея градиентного бустинга состоит в построении ансамбля последовательно уточняющих друг друга элементарных моделей. n-ная элементарная модель обучается на “ошибках” ансамбля из n-1 моделей, ответы моделей взвешенно суммируются. В XGBoost поддерживаются три основные формы повышения градиента:

  • Алгоритм Gradient Boosting также называется градиентной машиной повышения, включая скорость обучения.

  • Stochastic Gradient Boosting с суб-выборкой в строке, столбце и столбце на каждый уровень разделения.

  • Регулярное усиление градиента с регуляцией L1 и L2.

  1. Системные функции

Библиотека предоставляет систему для использования в различных вычислительных средах, не в последнюю очередь:

  • Параллелизацию построения дерева с использованием всех ваших ядер процессора во время обучения.

  • Распределенные вычисления для обучения очень крупных моделей с использованием кластера машин.

  • Внекорпоративные вычисления для очень больших наборов данных, которые не вписываются в память.

  • Кэш Оптимизацию структуры данных и алгоритма для наилучшего использования аппаратного обеспечения.

  1. xgb.train: формат исходных данных и параметры модели

Основной функцией xgboost для создания моделей является xgb.train. Также доступна функция xgboost с более простым интерфейсом. Данные для xgb.train должны быть в формате xgb.DMatrix, в то время как xgboost также принимает на вход обычные матрицы matrix и разреженные матрицы dgCMatrix. Используем встроенную библиотеку данных agaricus.

library(xgboost)
data("agaricus.train")
data("agaricus.test")
train <- agaricus.train
test <- agaricus.test
bst <- xgboost(data = train$data, label = train$label, max.depth = 4, nround = 3, objective = "binary:logistic")
[1] train-error:0.006142 
[2] train-error:0.006756 
[3] train-error:0.001228 

Создадим объекты класса xgb.DMatrix с обучающей и тестовой выборками. Необходимо задать матрицу признаков и вектор ответов.

5(a) Параметры xgboost

Полный список параметров весьма обширен и состоит из:

  • общих параметров (главный из них - тип бустера);

  • параметров, специфичных для каждого бустера;

  • параметров решаемой задачи.

Пакет xgboost реализует бустинг на основе деревьев (booster = “gbtree” - вариант по умолчанию) и его модификацию DART (booster = “dart”), а также бустинг на основе линейных моделей (booster = “gblinear”). Мы рассмотрим первые два, поскольку бустинг линейных моделей обычно менее результативен.

Если очень кратко

Параметры max_depth, min_child_weight и gamma непосредственно ограничивают сложность модели, subsample и colsample_bytree делают её более устойчивой к шуму за счет добавления случайного выбора наблюдений и предикторов, eta влияет на скорость обучения.

Если не очень

5(b) Общие параметры:

  1. Тип бустера [default=gbtree]
  • Для классификаций - gbtree, dart. Для регрессий - все.
  1. Количество потоков: nthread [default= максимальное количество ядер]
  • Активирует паралельные вычисления. Обычно этот параметр не меняют.
  1. silent[default=0]
  • Если выставить на 1, то в консоли появится куча сообщений, лучше не менять.

5(c) Параметры бустера:

  • nrounds [default=100] - контролирует максимальное число итераций. Схоже с количеством деревьев, которые необходимо вырастить. Необходимо настраивать с помощью cv (кроссвалидация).
  • max.depth [default=6]
  • [range: (0,Inf)] - максимальная глубина дерева. Критически важный параметр: выбор слишком глубоких деревьев приводит к переобучению, а слишком маленькие деревья не позволят эффективно восстановить искомую зависимость. Значение по умолчанию равно 6, имеет смысл попробовать значения чуть больше и чуть меньше, настраивать лучше через cv.
  • eta [default=0.3]
  • [range: (0,1)] - скорость обучения модели. Критически важный параметр, контролирующий с каким весом предсказания каждой следующей модели суммируются с предсказаниями ансамбля. Значение по умолчанию (0.3) является слишком большим, обычно хорошо работают значения меньше 0.1. Слишком маленьким его сделать тяжело, уменьшение eta компенсируется увеличением количества итераций (nrounds) b ценой большего времени обучения.
  • gamma [default=0]
  • [range: (0,Inf)] - минимальное уменьшение значения функции потерь. Контролирует регуляризацию или предотвращает переобучение. Чем выше значение, тем выше регуляризация. Регуляризация “наказывает” большие коэффициенты, которые не улучшают производительность модели. 0 означает отсутствие регуляризации.
  • Лайфхак: начните с 0 и проверьте коэффициент ошибки CV. Если вы видите train error>>> test error, добавьте gamma. Чем выше gamma, тем ниже разница в CV train и test. Если вы не знаете, какое значение установить, то попробуйте gamma = 5 и посмотрите результативность модели. Нужно запомнить, что gamma улучшает модель, когда вы хотите использовать “мелкие” (низкий max_depth) деревья. Можно оставить значение 0 или сделать равным какому-то небольшому числу, например 0.01.
  • subsample [default=1]
  • [range: (0,1)] - доля объектов обучающей выборки, используемых на каждой итерации. Еще один критически важный параметр, позволяющий значительно улучшить модель. По умолчанию равен 1, значение от 0.5 до 0.8 может оказаться хорошим выбором (но нужно принимать во внимание размер выборки).
  • colsample_bytree [default=1]
  • [range: (0,1)] - доля переменных, используемых на каждой итерации. Вместе с предыдущим параметром реализует преимущества алгоритма Random Forest (на каждой итерации используется только часть наблюдений и предикторов). Обычно хорошо работают значения между 0.5 и 1.
  • min_child_weight [default=1]
  • [range:(0,Inf)] - минимальное количество наблюдений в листе дерева. Имеет смысл проверить несколько значений больше 1 (например, 3, 5 и более).
  • lambda [default=0] - контролирует регуляризацию L2 (эквивалент Гребневой регрессии) по весам. Используется для предотвращения переобучения.
  • alpha [default=1] - Контролирует регуляризацию L1 (эквивалент регресси Лассо) по весам. В дополнение к сжатию, добавление параметра alpha приводит к удалению нерелевантных признаков (feature selection). Поэтому этот параметр полезнее использовать для больших датасетов.
  • max_delta_step [default = 0] -максимальный шаг дельты (прибавляемая величина) для оценки веса каждого дерева. Если значение равно 0, это означает, что ограничений нет. Если значение установить как положительное, это может помочь сделать шаг обновления более консервативным. Обычно этот параметр не нужен, но он может помочь в логистической регрессии, когда класс крайне несбалансирован. Установите значение от 1-10 для управления апдейтами.

5(d) Параметры решаемой задачи.

Эти параметры определяют методы функции потерь и оценки модели. В дополнение к перечисленным ниже параметрам вы можете использовать настраиваемую функцию objective / evaluation.

  1. Objective [default=reg:linear]
  • reg: linear - для линейной регрессии
  • binary:logistic - логистическая регрессия для бинарной классификации. Она выдает спрогнозированные значения вероятностей.
  • multi:softmax - мультиклассификация с использованием softmax. Она выдает спрогнозированные метки классов (class labels). Для этого требуется установить параметр num_class, обозначающий количество уникальных классов прогнозирования.
  • multi:softprob - мультиклассификация с использованием softmax. Она выдает предсказанные вероятности класса (class probabilities).
  1. eval_metric [нет значения по умолчанию, зависит от выбранной цели]
  • Эти показатели используются для оценки точности модели на данных для валидации. Для регрессии показатель по умолчанию - RMSE. Для классификации показатель по умолчанию - error.
  • Доступные функции error следующие:
    • mae (mean absolute error)- средняя абсолютная ошибка (используется при регрессии)
    • Logloss - Отрицательная вероятность (используется в классификации)
    • AUC (area under curve) - зона под кривой (используется в классификации)
    • RMSE - среднеквадратическая ошибка (используется при регрессии)
    • error - степень двоичной ошибки классификации [#wrong cases / # all cases]
    • mlogloss - многоклассовая логистическая функция ошибки (используется в классификации)

Строим модель

  1. xgb.train и подготовка данных

На вход модель принимает данные в виде Dense (плотных) матриц с нулями и Sparse (разреженых) матриц без нулей: dgCMatrix. Каждая переменная в датасете является списком (list), который содержит label и data.

label - результат нашего датасета, то есть это бинарная классификация, которую мы постараемся спрогнозировать.

data("agaricus.test")
data("agaricus.train")

dtrain <- xgb.DMatrix(data=agaricus.train$data,label=agaricus.train$label)
dtest <- xgb.DMatrix(data=agaricus.test$data,label=agaricus.test$label)

watchlist = list(train=dtrain,test=dtest) #список xgb.DMatrix с тэгами
table(agaricus.train$label)

   0    1 
3373 3140 
bst <- xgboost(data=dtrain,
               nrounds=20000,
               eval_metric='auc',
               objective= "reg:linear",
               max_depth=4,
               subsample_bytree=0.7,
               nthread=4,
               maximize = F,
               early_stopping_rounds = 10)
[1] train-auc:0.994042 
Will train until train_auc hasn't improved in 10 rounds.

[2] train-auc:0.999470 
[3] train-auc:0.999470 
[4] train-auc:0.999599 
[5] train-auc:0.999602 
[6] train-auc:0.999602 
[7] train-auc:1.000000 
[8] train-auc:1.000000 
[9] train-auc:1.000000 
[10]    train-auc:1.000000 
[11]    train-auc:1.000000 
Stopping. Best iteration:
[1] train-auc:0.994042
pred <- predict(bst, dtest) #Проверка на тестовой выборке
xgbpred <- ifelse (pred > 0.5,1,0)

Xgboost работает только с числовыми переменными (numeric). Если в датасете присутствуют качественные переменные (categorical), их нужно будет конвертировать в числовые.

library(caret)
data("diamonds")
index <- createDataPartition(diamonds$cut, p=0.7, list = FALSE)
train2 <- diamonds[index,]
test2 <- diamonds[-index,]

#обязательное условие для ЗП - быть кол-венной переменной, конвертируем в числовые:
train_labels <- as.integer((train2$cut))
test_labels <- as.integer((test2$cut))

#обязательное условие для НП - быть матрицей
trainM <- data.matrix(train2[,-2])
testM <- data.matrix(test2[,-2])

Mtrain <- xgb.DMatrix(data=trainM, label=train_labels)
Mtest <- xgb.DMatrix(data=testM, label=test_labels)

6(а) Подсказки

  • Если у вас депрессия от низкой точности модели, попробуйте следующее:
    • исправьте eta на = 0.1, оставьте остальные параметры по умолчанию, используя xgb.cv вычислите “правильные” n_rounds. Теперь создайте модель с этими параметрами и проверьте точность.
    • В противном случае вы можете сделать grid search по остальным параметрам (max_depth, gamma, subample, colsample_bytree и т.д.) установив eta и nrounds.
    • Если вы используете gbtree, не нужно добавлять gamma, пока не заметите существенную разницу в train и test error.
    • Используя параметры из grid search, если необходимо настройте alpha и lambda.
    • Наконец, увеличьте / уменьшите eta и прогоните код еще раз. Нужно помнить, что слишком низкое значение eta позволит модели научиться глубокому взаимодействию в данных, и как побочный эффект в процессе словить шум.
  1. xgb.cv (кросс-валидация)

Формула: xgb.cv(params = list(), data, nrounds, nfold, label = NULL, missing = NA, prediction = FALSE, showsd = TRUE, metrics = list(), obj = NULL, feval = NULL, stratified = TRUE, folds = NULL, verbose = TRUE, print_every_n = 1L, early_stopping_rounds = NULL, maximize = NULL, callbacks = list(), …)

cv  <- xgb.cv(data=dtrain,
                 nrounds=20000,
                 eval_metric='auc',
                 objective= "reg:linear",
                 max_depth=4,
                 subsample_bytree=0.7,
                 nthread=4,
                 maximize = F,
                 early_stopping_rounds = 10,
                 nfold=10) # первичные данные будут случайно поделены на равные подвыборки
[1] train-auc:0.995726+0.002242 test-auc:0.993605+0.003832 
Multiple eval metrics are present. Will use test_auc for early stopping.
Will train until test_auc hasn't improved in 10 rounds.

[2] train-auc:0.999434+0.000136 test-auc:0.999502+0.000996 
[3] train-auc:0.999489+0.000121 test-auc:0.999502+0.000996 
[4] train-auc:0.999591+0.000098 test-auc:0.999502+0.000996 
[5] train-auc:0.999595+0.000096 test-auc:0.999502+0.000996 
[6] train-auc:0.999770+0.000208 test-auc:0.999472+0.001061 
[7] train-auc:0.999953+0.000098 test-auc:0.999472+0.001061 
[8] train-auc:0.999983+0.000051 test-auc:0.999712+0.000864 
[9] train-auc:0.999983+0.000051 test-auc:0.999712+0.000864 
[10]    train-auc:0.999983+0.000051 test-auc:0.999712+0.000864 
[11]    train-auc:0.999983+0.000051 test-auc:0.999712+0.000864 
Stopping. Best iteration:
[1] train-auc:0.995726+0.002242 test-auc:0.993605+0.003832
print(cv)
##### xgb.cv 10-folds
 iter train_auc_mean train_auc_std test_auc_mean test_auc_std
    1      0.9957259  2.241560e-03     0.9936046 0.0038324799
    2      0.9994341  1.362875e-04     0.9995025 0.0009958047
    3      0.9994887  1.205513e-04     0.9995025 0.0009958047
    4      0.9995915  9.758099e-05     0.9995025 0.0009958047
    5      0.9995950  9.590203e-05     0.9995025 0.0009958047
    6      0.9997700  2.075693e-04     0.9994723 0.0010608663
    7      0.9999533  9.775280e-05     0.9994723 0.0010608663
    8      0.9999831  5.070000e-05     0.9997121 0.0008637000
    9      0.9999831  5.070000e-05     0.9997121 0.0008637000
   10      0.9999831  5.070000e-05     0.9997121 0.0008637000
   11      0.9999831  5.070000e-05     0.9997121 0.0008637000
Best iteration:
 iter train_auc_mean train_auc_std test_auc_mean test_auc_std
    1      0.9957259    0.00224156     0.9936046   0.00383248

7(b) Ранняя остановка модели (early stopping)

Этот параметр используется, когда мы не знаем сколько деревьев нам нужно построить. Установив параметр early_stopping, xgboost завершит процесс обучения, если производительность ухудшится при последующих итерациях.

param <- list(booster = "gbtree", #параметры
              max.depth = 6, 
              eta = 0.1, 
              gamma = 0, 
              subsample = 1, 
              colsample_bytree = 0.4, 
              min_child_weight = 1,
              objective = "reg:linear")

xgbcv <- xgb.cv(params=param, data = dtrain, label = agaricus.train$label, nfold = 5,
              nrounds = 20,
              early_stopping_rounds = 5, maximize = F)
[1] train-rmse:0.451225+0.000061    test-rmse:0.451384+0.000469 
Multiple eval metrics are present. Will use test_rmse for early stopping.
Will train until test_rmse hasn't improved in 5 rounds.

[2] train-rmse:0.407383+0.000170    test-rmse:0.407647+0.000749 
[3] train-rmse:0.368095+0.000358    test-rmse:0.368450+0.000996 
[4] train-rmse:0.332861+0.000489    test-rmse:0.333378+0.001368 
[5] train-rmse:0.301126+0.000638    test-rmse:0.301675+0.001530 
[6] train-rmse:0.272636+0.000661    test-rmse:0.273272+0.001865 
[7] train-rmse:0.247157+0.000707    test-rmse:0.248046+0.002371 
[8] train-rmse:0.224212+0.000803    test-rmse:0.225113+0.002585 
[9] train-rmse:0.203653+0.000730    test-rmse:0.204906+0.003046 
[10]    train-rmse:0.185152+0.000723    test-rmse:0.186565+0.003301 
[11]    train-rmse:0.168837+0.000857    test-rmse:0.170594+0.003816 
[12]    train-rmse:0.154325+0.000859    test-rmse:0.156237+0.004057 
[13]    train-rmse:0.141267+0.001117    test-rmse:0.143293+0.004213 
[14]    train-rmse:0.129802+0.001157    test-rmse:0.132228+0.004576 
[15]    train-rmse:0.119657+0.001403    test-rmse:0.122138+0.004731 
[16]    train-rmse:0.110813+0.001518    test-rmse:0.113594+0.005128 
[17]    train-rmse:0.102907+0.001739    test-rmse:0.105762+0.005323 
[18]    train-rmse:0.095910+0.001727    test-rmse:0.099214+0.005742 
[19]    train-rmse:0.089495+0.001780    test-rmse:0.093060+0.005662 
[20]    train-rmse:0.083912+0.001597    test-rmse:0.087876+0.006237 

7(c) Также можно посмотреть на ошибку кросс-валидации:

min(xgbcv$test.error.mean)
[1] Inf
  1. Оценка важности предикторов

Если дерево слишком глубокое или количество параметров велико, тогда будет сложно найти какие-либо важные паттерны. Есть простой способ проверить важность предикторов. Проверка статистической значимости переменных в модели подскажет нам как оптимизировать матрицу предикторов для обучения XGB-модели. Лучше всего использовать функцию xgb.plot.importance в которую мы передадим агрегированную таблицу важности параметров.

bst <- xgboost(data = agaricus.train$data,
               label=agaricus.train$label, 
               max.depth = 2,
               eta = 0.1, nthread = 2, 
               nround = 2,
               objective = "binary:logistic")
[1] train-error:0.046522 
[2] train-error:0.041609 
importance_matrix <- xgb.importance(agaricus.train$data@Dimnames[[2]], model = bst)

Output graph

9. Оценка модели

При оценке нашей модели, можно ее визуализировать:

library(Ecdat)
devtools::install_github("rich-iannone/DiagrammeR",force=T)
#library(DiagrammeR)
train <- agaricus.train

bst <- xgboost(data = train$data, label = train$label, max.depth = 2,
               eta = 1, nthread = 2, nround = 2,objective = "binary:logistic")
[1] train-error:0.046522 
[2] train-error:0.022263 
#train$data@Dimnames[[2]] - название колонки в матрице:
#xgb.plot.tree(train$data@Dimnames[[2]], model = bst)

ROC-curve

table(agaricus.test$label,round(pred))
library(ROSE)
roc.curve(agaricus.test$label,pred)

Output graph

   
      0   1
  0 823  12
  1   0 776

Area under the curve (AUC): 0.993

Confusion matrix

Тут не работает стандартная формула, но принцип должен быть ясен:

library(caret)
#confusionMatrix(pred, agaricus.test$label) - стандартная формула, но пришлось решить через table:

u <- union(pred, agaricus.test$label)
t <- table(factor(pred, u), factor(agaricus.test$label, u))
confusionMatrix(t)
Confusion Matrix and Statistics

                   
                    0.350358009338379 0.646413385868073 0.35049706697464
  0.350358009338379                 0                 0                0
  0.646413385868073                 0                 0                0
  0.35049706697464                  0                 0                0
  0.35384613275528                  0                 0                0
  0.350943386554718                 0                 0                0
  0.647222220897675                 0                 0                0
  0.645312488079071                 0                 0                0
  0.361538469791412                 0                 0                0
  0.645454525947571                 0                 0                0
  0                                 0                 0                0
  1                                 0                 0                0
                   
                    0.35384613275528 0.350943386554718 0.647222220897675
  0.350358009338379                0                 0                 0
  0.646413385868073                0                 0                 0
  0.35049706697464                 0                 0                 0
  0.35384613275528                 0                 0                 0
  0.350943386554718                0                 0                 0
  0.647222220897675                0                 0                 0
  0.645312488079071                0                 0                 0
  0.361538469791412                0                 0                 0
  0.645454525947571                0                 0                 0
  0                                0                 0                 0
  1                                0                 0                 0
                   
                    0.645312488079071 0.361538469791412 0.645454525947571
  0.350358009338379                 0                 0                 0
  0.646413385868073                 0                 0                 0
  0.35049706697464                  0                 0                 0
  0.35384613275528                  0                 0                 0
  0.350943386554718                 0                 0                 0
  0.647222220897675                 0                 0                 0
  0.645312488079071                 0                 0                 0
  0.361538469791412                 0                 0                 0
  0.645454525947571                 0                 0                 0
  0                                 0                 0                 0
  1                                 0                 0                 0
                   
                      0   1
  0.350358009338379  94   0
  0.646413385868073  12 744
  0.35049706697464  681   0
  0.35384613275528   10   0
  0.350943386554718  34   0
  0.647222220897675   0  19
  0.645312488079071   0   9
  0.361538469791412   4   0
  0.645454525947571   0   4
  0                   0   0
  1                   0   0

Overall Statistics
                                     
               Accuracy : 0          
                 95% CI : (0, 0.0023)
    No Information Rate : 0.5183     
    P-Value [Acc > NIR] : 1          
                                     
                  Kappa : 0          
 Mcnemar's Test P-Value : NA         

Statistics by Class:

                     Class: 0.350358009338379 Class: 0.646413385868073
Sensitivity                                NA                       NA
Specificity                           0.94165                   0.5307
Pos Pred Value                             NA                       NA
Neg Pred Value                             NA                       NA
Prevalence                            0.00000                   0.0000
Detection Rate                        0.00000                   0.0000
Detection Prevalence                  0.05835                   0.4693
Balanced Accuracy                          NA                       NA
                     Class: 0.35049706697464 Class: 0.35384613275528
Sensitivity                               NA                      NA
Specificity                           0.5773                0.993793
Pos Pred Value                            NA                      NA
Neg Pred Value                            NA                      NA
Prevalence                            0.0000                0.000000
Detection Rate                        0.0000                0.000000
Detection Prevalence                  0.4227                0.006207
Balanced Accuracy                         NA                      NA
                     Class: 0.350943386554718 Class: 0.647222220897675
Sensitivity                                NA                       NA
Specificity                            0.9789                  0.98821
Pos Pred Value                             NA                       NA
Neg Pred Value                             NA                       NA
Prevalence                             0.0000                  0.00000
Detection Rate                         0.0000                  0.00000
Detection Prevalence                   0.0211                  0.01179
Balanced Accuracy                          NA                       NA
                     Class: 0.645312488079071 Class: 0.361538469791412
Sensitivity                                NA                       NA
Specificity                          0.994413                 0.997517
Pos Pred Value                             NA                       NA
Neg Pred Value                             NA                       NA
Prevalence                           0.000000                 0.000000
Detection Rate                       0.000000                 0.000000
Detection Prevalence                 0.005587                 0.002483
Balanced Accuracy                          NA                       NA
                     Class: 0.645454525947571 Class: 0 Class: 1
Sensitivity                                NA   0.0000   0.0000
Specificity                          0.997517   1.0000   1.0000
Pos Pred Value                             NA      NaN      NaN
Neg Pred Value                             NA   0.4817   0.5183
Prevalence                           0.000000   0.5183   0.4817
Detection Rate                       0.000000   0.0000   0.0000
Detection Prevalence                 0.002483   0.0000   0.0000
Balanced Accuracy                          NA   0.5000   0.5000

10. XGBoost и Random Forest

Благодаря экспериментальному параметру num_parallel_tree можно задать количество одновременно создаваемых деревьев и представить Random Forest как частный случай бустинговой модели с одной итерацией. А если использовать больше одной итерации, то получится бустинг “случайных лесов”, когда каждый “случайный лес” выступает в качестве элементарной модели. Разница между Random Forest и XGBoost в том, что в лесу деревья строятся независимо, а в xgboost дереве N+1 фокусирует обучение на том, что было недомоделировано предыдущим.

train <- agaricus.train
test <- agaricus.test
#Random Forest - 1000 trees

bst <- xgboost(data = train$data, label = train$label, max.depth = 4, num_parallel_tree = 1000, subsample = 0.5, colsample_bytree =0.5, nround = 1, objective = "binary:logistic")
[1] train-error:0.014279 
param <- list(booster = "gbtree", #параметры
              max.depth = 25, 
              eta = 1, 
              gamma = 0, 
              subsample = 1, 
              colsample_bytree = 0.4, 
              min_child_weight = 1,
              num_parallel_tree = 200,
              objective = "reg:linear", eval_metric = "rmse")
set.seed(100)
fit2 <- xgb.train(data = dtrain,
                  nrounds = 5,
                  params = param,
                  verbose = 1,
                  watchlist = list(train = dtrain, test = dtest))
[1] train-rmse:0.041519 test-rmse:0.047040 
[2] train-rmse:0.028666 test-rmse:0.032915 
[3] train-rmse:0.027666 test-rmse:0.031937 
[4] train-rmse:0.027589 test-rmse:0.031869 
[5] train-rmse:0.027583 test-rmse:0.031865 
  1. Сохраняем данные
# Сохраняем матрицу
xgb.DMatrix.save(dtrain, "dtrain.buffer") 
[1] TRUE
# Сохраняем модель
xgb.save(bst, "xgboost.model")
[1] TRUE
# Загружаем модель в консоль
bst2 <- xgb.load("xgboost.model")

Далее:

Xgbfi

Column

Xgbfi

XGBfi - XGBoost Feature Interactions & Importance

Методы, основанные на построении деревьев, преводсходят другие в способности использовать/распознавать взаимодействие признаков. При построении дерево выбирает взаимодействие признаков/предикторов. Например, на то купите ли вы мороженое скорее повлияет не наличие у вас лишних денег, а тот факт жарко на улице или нет. Но взаимодействие двух этих предикторов может сильно повлиять на то, купите ли вы мороженое.

Традиционный способ для оценки признаков основывается на оценке важности предикторов (feature importance). Однако, такая оценка не позволяет выяснить взаимодействия предикторов второго и третьего порядка. Определение этих взаимодействий имеет важное значение для создания более точных моделей, особенно при поиске предикторов для линейных моделей.

xgbfi очень хорошо работает на больших объемах данных, когда сложно выяснить взаимодействие разных параметров. Мы будем смотреть функцию на примере встроенных данных Icecream. Библиотека Ecdat нужна, чтобы сработала команда xgb.plot.tree

  1. Строим модель через xgboost:
bst <- xgboost(data = train.data, 
               label = Icecream$cons,
               max.depth = 3, eta = 1, nthread = 2, 
               nround = 2, objective = "reg:linear")
[1] train-rmse:0.034907 
[2] train-rmse:0.023540 

Чтобы лучше понять как работает модель, мы можем построить график дерево, чтобы посмотреть на важные предикторы.

xgb.plot.tree(feature_names = names((Icecream[,-1])), model = bst)

Output graph

Построив дерево, мы видим, что как и ожидали temp (температура) является важным предикторов. Можно посмотреть на матрицу важности предикторов:

xgb.importance(colnames(train.data, do.NULL = TRUE, prefix = "col"), model = bst)
   Feature       Gain      Cover Frequency
1:    temp 0.75047187 0.66896552 0.4444444
2:  income 0.18846270 0.27586207 0.4444444
3:   price 0.06106542 0.05517241 0.1111111

Все это знакомо для тех, кто уже пользовался деревом решений для создания модели. Но что делать с взаимодействием переменных второго или третьего уровня. Как составить их рейтинг?

  1. Экспорт дерева

Следующим шагом будет сохранение дерева и перемещение его из R, чтобы xgbfi смог парсить дерево. Этот код поможет создать два необходимых файла: xgb.dump и fmap.text.

featureList <- names(Icecream[,-1])
featureVector <- c() 

#Тут абсолютный плагиат, код хорошо бы разобрать
for (i in 1:length(featureList)) { 
  featureVector[i] <- paste(i-1, featureList[i], "q", sep="t") 
}
write.table(featureVector, "fmap.txt", row.names=FALSE, quote = FALSE, col.names = FALSE)

xgb.dump(model = bst, fname = 'xgb.dump', with_stats = FALSE, dump_format = c("text", "json"))
[1] TRUE

3. Как пользоваться xgbfi

Первым шагом будет копирование репозитория xgbfi на ваш компьютер.

3(a). Для этого

Зайти на страницу репозитория и скачать его, нажав на кнопку download, а также скопировать url. Для этого нужно будет установить приложение github desktop.

Репозиторий скопируется на ваш компьютер в ту директорию, которой вы обычно пользуетесь (можете поменять).Затем скопируйте файлы xgb.dump и fmap.text в директорию bin в папке C:.

3(b). XgbFeatureInteractions.exe

Перейдите в терминал или в командной строке (вызов cmd) и запустите приложение XgbFeatureInteractions.exe, это приложение находится в папке bin и его можно запустить вручную. Существует также файл XgbFeatureInteractions.exe.config, содержащий параметры конфигурации в директории bin.

После запуска приложения он выведет таблицу Excel (в этой же папке) с названием: XgbFeatureInteractions.xlsx. Откройте таблицу и вы увидите:

Эта вкладка excel покажет взаимодействия первого уровня. Результаты схожи с тем, что показала оценка важности предикторов. Если вы посмотрите вкладку Interaction Depth 1 или Interaction Depth 2. Теперь можно ранжировать взаимодействия более высокого порядка. С простым набором данных как Icecream вы видите, что результаты из xgbfi соответствуют тому, что происходит в дKереве. Реальная ценность этого инструмента проявляется при использовании в больших наборах данных, где трудно исследовать деревья для выяснения взаимодействий.

Теперь вы обладаете секретным знанием, пользуйтесь им ответственно.

Оригинал статьи

Random Forest

Column

Random Forest

Случайный лес (Random forest)

Алгоритм был разработан для улучшения предсказывающих качеств деревьев и основан на построении большого количества разных деревьев. Ценой улучшения предсказывающих способностей является ухудшение интерпретируемости результатов

Принцип работы: каждое дерево голосует за определенный результат, предсказанием модели является прогноз с наибольшим количеством голосов

Основные параметры случайного леса:

Минимальное количество наблюдений в подмножестве (nodesize)

Количество деревьев (ntree)

Загрузка библиотеки

Генерирование случайного леса для обучения

            
             setosa versicolor virginica
  setosa         35          0         0
  versicolor      0         28         4
  virginica       0          3        29

Распечатка модели Random Forest и посмотр важных функций


Call:
 randomForest(formula = Species ~ ., data = trainData, ntree = 100,      proximity = TRUE) 
               Type of random forest: classification
                     Number of trees: 100
No. of variables tried at each split: 2

        OOB estimate of  error rate: 7.07%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         35          0         0  0.00000000
versicolor      0         28         3  0.09677419
virginica       0          4        29  0.12121212

Иллюстрация

plot(iris_rf)

Output graph

Показатели

             MeanDecreaseGini
Sepal.Length         6.106949
Sepal.Width          2.010273
Petal.Length        26.963992
Petal.Width         30.082766
varImpPlot(iris_rf)

Output graph

Построение случайного леса для тестирования

            
irisPred     setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         19         0
  virginica       0          0        17

увидеть маржу, положительную или отрицательную, если она означает правильную классификацию {}

plot(margin(iris_rf,testData$Species))

Output graph

Опция Combine

Объединение еще два ансамбля деревьев в один.


Call:
 randomForest(formula = Species ~ ., data = iris, ntree = 50,      norm.votes = FALSE) 
               Type of random forest: classification
                     Number of trees: 150
No. of variables tried at each split: 2

Опция getTree

getTree(rfobj, k=1, labelVar=FALSE)

rfobj - объект randomForest

k выбор какого именно дерева?

labelVar Использование метки для разделения переменных и прогнозируемого класса

Пример рассматриваем 3 дерево из всего леса

left daughter строка, где находится левый дочерний узел; 0, если узел является терминальным

right daughter строка, в которой находится правый дочерний узел; 0, если узел является терминальным

split var какая переменная использовалась для разделения узла; 0, если узел является терминальным

split point точка разделения

status положение дел

is the node terminal (-1) or not (1)

the prediction for the node; 0 if the node is not terminal

   left daughter right daughter    split var split point status prediction
1              2              3 Petal.Length        2.45      1       <NA>
2              0              0         <NA>        0.00     -1     setosa
3              4              5 Sepal.Length        5.75      1       <NA>
4              6              7  Petal.Width        1.75      1       <NA>
5              8              9 Sepal.Length        7.05      1       <NA>
6              0              0         <NA>        0.00     -1 versicolor
7              0              0         <NA>        0.00     -1  virginica
8             10             11  Petal.Width        1.70      1       <NA>
9              0              0         <NA>        0.00     -1  virginica
10            12             13  Sepal.Width        2.85      1       <NA>
11            14             15 Petal.Length        4.85      1       <NA>
12            16             17 Petal.Length        4.80      1       <NA>
13             0              0         <NA>        0.00     -1 versicolor
14            18             19  Sepal.Width        3.10      1       <NA>
15             0              0         <NA>        0.00     -1  virginica
16             0              0         <NA>        0.00     -1 versicolor
17            20             21  Petal.Width        1.55      1       <NA>
18             0              0         <NA>        0.00     -1  virginica
19             0              0         <NA>        0.00     -1 versicolor
20             0              0         <NA>        0.00     -1  virginica
21             0              0         <NA>        0.00     -1 versicolor

Опция grow добавление дополнительных деревьев в существующий ансамбль деревьев grow(x, how.many, …), x объект класса randomForest, который содержит лесной компонент, how.many количество деревьев для добавления к объекту randomForest.


Call:
 randomForest(formula = Species ~ ., data = iris, ntree = 50,      norm.votes = FALSE) 
               Type of random forest: classification
                     Number of trees: 100
No. of variables tried at each split: 2

Извлечение переменной важности

       %IncMSE IncNodePurity
cyl  17.105727     186.48048
disp 19.988462     245.70827
hp   17.449754     191.13085
drat  6.866872      67.66617
wt   17.849921     233.19790
qsec  5.238511      33.91407
vs    4.723536      28.56053
am    5.103218      14.76874
gear  4.145003      21.21196
carb  6.670874      28.91842
       %IncMSE
cyl  17.105727
disp 19.988462
hp   17.449754
drat  6.866872
wt   17.849921
qsec  5.238511
vs    4.723536
am    5.103218
gear  4.145003
carb  6.670874

MDSplot(rf, fac, k=2, palette=NULL, pch=20, …) Построение масштабных координат матрицы близости от randomForest

rf объект класса randomForest, который содержит компонент близости.

fac фактор, который использовался в качестве ответа для обучения rf.

k количество измерений для масштабирующих координат.

palette цвета, используемые для различения классов; длина должна быть равна числу уровней

pch отображение символов для использования

data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

Output graph

2

MDSplot(iris.rf, iris$Species, palette=rep(1, 3), pch=as.numeric(iris$Species))

Output graph2

Исскуственно выбрасывает некоторые значения


Call:
 randomForest(formula = Species ~ ., data = iris.na, na.action = na.roughfix) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 2

        OOB estimate of  error rate: 4.67%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         50          0         0        0.00
versicolor      0         46         4        0.08
virginica       0          3        47        0.06

outlier Вычислить отдаленные меры

iris.rf <- randomForest(iris[,-5], iris[,5], proximity=TRUE)
plot(outlier(iris.rf), type="h",
col=c("red", "green", "blue")[as.numeric(iris$Species)])

Output graph

partialPlot

График частичной зависимости x an объекта класса randomForest, который содержит лесной компонент. ### pred.data прогнозные данные, используем/ для построения графика, обычно данные обучения, используемые для построения случайного леса. ### x.var name of the variable for which partial dependence is to be examined. ###which.class For classification data, the class to focus on (default the first class). ##w weights to be used in averaging; if not supplied, mean is not weighted ## plot whether the plot should be shown on the graphic device. ##add whether to add to existing plot (TRUE). ##n.pt if x.var is continuous, the number of points on the grid for evaluating partial dependence. ##rug whether to draw hash marks at the bottom of the plot indicating the deciles of x.var. ## xlab label for the x-axis. ## ylab label for the y-axis. ## main main title for the plot.

data(iris)
set.seed(543)
iris.rf <- randomForest(Species~., iris)
partialPlot(iris.rf, iris, Petal.Width, "versicolor")

Output graph

прогнозирования случайных объектов леса

            predicted
observed     setosa versicolor virginica
  setosa          5          0         0
  versicolor      0          8         2
  virginica       0          1        14
 int [1:30, 1:500] 10 10 10 10 10 13 9 13 13 15 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:30] "18" "25" "40" "44" ...
  ..$ : chr [1:500] "1" "2" "3" "4" ...

Prophet

Column

Prophet

prophet

5 июня 2018 г

Прогнозирование временных рядов — это достаточно популярная аналитическая задача. Прогнозы используются, например, для понимания, сколько серверов понадобится online-сервису через год, каков будет спрос на каждый товар в гипермаркете, или для постановки целей и оценки работы команды (для этого можно построить baseline прогноз и сравнить фактическое значение с прогнозируемым).

Существует большое количество различных подходов для прогнозирования временных рядов, такие как ARIMA, ARCH, регрессионные модели, нейронные сети и т.д. Рассмотрим как работает библитоека prophet

По своей сути, процедура prophet является аддитивной моделью регрессии с четырьмя основными компонентами:

  • Кусочно-линейная или логистическая тенденция кривой роста. Пророк автоматически обнаруживает изменения в тенденциях, выбирая точки изменения из данных.
  • Годовой сезонный компонент, смоделированный с использованием рядов Фурье.
  • Еженедельный сезонный компонент с использованием фиктивных переменных.
  • Предоставленный пользователем список важных праздников.

Если расмотреть формулу prophet, то это выглядит примерно так:

additive regression model, состоящая из следующих компонент: y(t) = g(t) + s(t) + h(t) + _{t}

  1. Сезонные компоненты s(t) отвечают за моделирование периодических изменений, связанных с недельной и годовой сезонностью. Недельная сезонность моделируется с помощью dummy variables. Добавляются 6 дополнительных признаков, например, [monday, tuesday, wednesday, thursday, friday, saturday], которые принимают значения 0 и 1 в зависимости от даты. Признак sunday, соответствующий седьмому дню недели, не добавляют, потому что он будут линейно зависеть от других дней недели и это будет влиять на модель. Годовая же сезонность моделируется рядами Фурье.

  2. Тренд g(t) — это кусочно-линейная или логистическая функция. С линейной функцией все понятно. Логистическая же функция вида g(t) = позволяет моделировать рост с насыщением, когда при увеличении показателя снижается темп его роста. Типичный пример — это рост аудитории приложения или сайта. Кроме всего прочего, библиотека умеет по историческим данным выбирать оптимальные точки изменения тренда. Но их также можно задать и вручную (например, если известны даты релизов новой функциональности, которые сильно повлияли на ключевые показатели).

  3. Компонента h(t) отвечает за заданные пользователем аномальные дни, в том числе и нерегулярные, такие как, например, Black Fridays.

  4. Ошибка _{t} содержит информацию, которая не учтена моделью.

Не все проблемы прогнозирования могут быть решены по той же процедуре. Пророк оптимизирован для задач бизнес-прогноза, с которыми создатели библиотеки столкнулись в Facebook, которые обычно имеют одну из следующих характеристик:

  • ежечасно, ежедневно или еженедельно, по крайней мере, через несколько месяцев (предпочтительно год) истории
  • сильные множественные «человеческие масштабы» сезонов: день недели и время года важные праздники, которые происходят с нерегулярными интервалами, которые известны заранее (например, Суперкубок)
  • разумное количество отсутствующих наблюдений или большие выбросы
  • изменения исторических тенденций, например, из-за запуска продукта или внесения изменений в журнал
  • тренды, которые являются нелинейными кривыми роста, где тренд достигает естественного предела или насыщается

Модель можно оценивать с помощью MAPE (mean absolute percentage error) — это средняя абсолютная ошибка нашего прогноза

Cтоит сказать пару слов о тех алгоритмах, с которыми сравнивали Prophet в публикации про prophet (https://research.fb.com/prophet-forecasting-at-scale/), тем более, большинство из них очень простые и их часто используют как базовые:

  • naive — наивный прогноз, когда мы прогнозируем все последующие значения последней точкой;
  • snaive - seasonal naive — такой прогноз подходит для данных с явно выраженной сезонностью. Например, если мы говорим о показатели с недельной сезонностью, то для каждого последующего понедельника мы будем брать значение за последний понедельник, для вторника — за последний вторник и так далее;
  • mean — в качестве прогноза берется среднее значение показателя;
  • arima - autoregressive integrated moving average — подробности на wiki;
  • ets - exponential smoothing — подробности на wiki.

Давайте расмотрим на практике как работает prophet. Прогноз мы будем делать на данных курса валют, а точнее стоимость одного рубля в тенге. В данных курс рубля в тенге с 2008 года.

Загружаем библиотеки:

Подгрузим датасет и посмотри на первые 6 строк

Загрузим данные и посмотрим на них

   V1       data     curs
1:  1 2008-06-03 5.080939
2:  2 2008-06-04 5.095567
3:  3 2008-06-05 5.072486
4:  4 2008-06-06 5.068038
5:  5 2008-06-07 5.094477
6:  6 2008-06-08 5.119856

Интерфейс prophet подстроен под такие переменные как ds, y. На вход он получает эти две переменные и строит прогноз.

  • ds — время, формат поля должен быть datetime;
  • y — целевая переменная в числовом формате.

Снизу мы перейменовали колонки в ds и y

Для получения прогноза нужно передать новый DataFrame, содержащий столбец ds. Для этого в библиотеке есть функция make_future_dataframe, которая принимает параметр periods — период, для которого мы хотим получить прогноз и freq — частота временного ряда (значение по умолчанию — день).

делаем make_future_dataframe и указываем periods = 120 дней. Можно указать больше дней, но чем больше дней мы указываем те больше коридор ошибки

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance

Функция predict делает предсказание и вставляет в переменную forecast

В виде прогноза Prophet вернет DataFrame с большим количеством столбцов. Наиболее интересные:

  • ds — временная метка для прогнозируемого значения;
  • yhat— прогнозируемое значение;
  • yhat_lower — нижняя граница прогноза;
  • yhat_upper — высшая граница прогноза.
             ds     yhat yhat_lower yhat_upper
2597 2018-09-30 5.760762   5.464978   6.048714
2598 2018-10-01 5.812712   5.510893   6.097445
2599 2018-10-02 5.828678   5.530629   6.132679
2600 2018-10-03 5.831263   5.548069   6.121898
2601 2018-10-04 5.836997   5.536304   6.102858
2602 2018-10-05 5.843490   5.557737   6.142455

Библиотека предоставляет удобные методы визуализации. Первый метод Prophet.plot отображает график прогноза

plot(m, forecast)

Output graph

Модель неплохо аппроксимирует исторические данные.

Второй метод Prophet.plot_components позволяет визуализировать отдельные компоненты: тренд, праздники, годовую и недельную сезонность:

prophet_plot_components(m, forecast)

Output graph

Наиболее интересным оказался график годовой сезонности

К началу весны и к началу осени ожидается сезонное подорожание рубля. Данный прогноз основан на сезонном колебании валют и не учитывает ни внешние, ни внутренние факторы.

Насыщенные прогнозы

Прогнозирование роста с помощью “cap” и “floor”

По умолчанию Prophet использует линейную модель для своего прогноза. При прогнозировании роста обычно существует максимальная достижимая точка: общий размер рынка, общий размер населения и т. д. а также есть найменьшая точка, где бизнесу стоит паниковать и прощитывать риски

Давайте для нашего прогноза добавим точки “cap” и “floor”. Мы должны указать пропускную способность в столбце “cap” и “floor”. Здесь мы примем конкретное значение, но это обычно устанавливается с использованием данных или опыта о размере рынка.

Важно отметить, что они “cap” должны быть указаны для каждой строки в фрейме данных и что он не обязательно должен быть постоянным. Если размер рынка растет, то “cap” может быть возрастающей последовательностью.

Модель логистического роста также может обрабатывать насыщающий минимум, который указан столбцом “floor” точно так же, как “cap” столбец указывает максимум:

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
future <- make_future_dataframe(m1, periods = 365)
kurs$cap <- 6
kurs$floor <- 1.5
future$cap <- 6
future$floor <- 1.5
fcst <- predict(m1, future)
plot(m1, fcst)

Output graph

Трендовые контрольные точки

** Автоматическое обнаружение точки смены в Prophet

Prophet обнаруживает точки смены, сначала указав большое количество потенциальных точек смены, при которых можно изменить скорость. Затем он помещает редкие изменения в величины изменения скорости (что эквивалентно L1-регуляризации) - это по существу означает, что у Prophet есть большое количество возможных мест, где скорость может измениться, но будет использовать как можно меньше из них

Несмотря на то, что у нас есть много мест, где скорость может измениться, из-за разреженного ранее, большинство из этих пунктов замены остаются неиспользованными.

Количество потенциальных точек изменения может быть задано с использованием аргумента “n_changepoints”, но это лучше настраивается путем корректировки регуляризации. Расположение точек смены знака можно визуализировать с помощью:

plot(m, forecast) + add_changepoints_to_plot(m)

Настройка гибкости тренда

По умолчанию контрольные точки выводятся только для первых 80% временных рядов, чтобы иметь много ВПП для прогнозирования тенденции вперед и избежать перерегулирования колебаний в конце временного ряда. Это значение по умолчанию работает во многих ситуациях, но не во всех, и может быть изменено с помощью “changepoint_range” аргумента. Например, m <- prophet(changepoint.range = 0.9) в R будет помещать потенциальные точки изменения в первые 90% временных рядов.

** Настройка гибкости тренда

Если изменения тренда перегружены (слишком большая гибкость) или недостаточно (недостаточно гибкости), вы можете отрегулировать силу разреженного ранее, используя входной аргумент changepoint_prior_scale. По умолчанию этот параметр установлен в 0.05. Увеличение его сделает тенденцию более гибкой:

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
forecast <- predict(m, future)
plot(m, forecast)

Output graph2

Уменьшение этого показателя сделает тенденцию менее гибкой:

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: absolute parameter change was below tolerance
forecast <- predict(m, future)
plot(m, forecast)

Output graph

** Указание местоположений контрольных точек

Если вы хотите, а не используя автоматическое обнаружение точки смены, вы можете вручную указать расположение потенциальных точек с “changepoints” аргументами. Изменения склона будут разрешены только в этих точках с той же разреженной регуляризацией, что и раньше. Например, можно создать сетку точек, как это делается автоматически, но затем увеличить эту сетку с определенными датами, которые, как известно, могут иметь изменения. В качестве другого примера, контрольные точки могут быть полностью ограничены небольшим набором дат, как это делается здесь:

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
forecast <- predict(m, future)
plot(m, forecast)

Output graph

Сезонность, праздничные эффекты и регрессоры

** Моделирование праздников и специальных событий

Если у вас есть праздники или другие повторяющиеся события, которые вы хотели бы моделировать, вы должны создать для них фреймворк данных. Он имеет две колонки (“holiday” и “ds”) и строку для каждого случая праздника. Он должен включать в себя все события праздника, как в прошлом (до тех пор, пока исторические данные идут), так и в будущем (вне зависимости от прогноза). Если они не будут повторяться в будущем, “Prophet” будет их моделировать, а затем не включать в прогноз.

Вы также можете включить столбцы “lower_window” и “upper_window” продлить праздничные [“lower_window”“,”upper_window“] дни до нескольких дней. Например, если вы хотите включить Рождество в дополнение к Рождеству, которое вы включили бы lower_window=-1,upper_window=0. Если вы хотите использовать Черную пятницу в дополнение ко Дню Благодарения, вы бы включили “lower_window=0” ,“upper_window=1”. Вы также можете включить столбец, “prior_scale” чтобы установить предыдущий масштаб отдельно для каждого праздника, как описано ниже.

Здесь мы создаем фреймворк данных, который включает даты всех выступлений плей-офф Пейтона Мэннинга: (Пока это сделаем для нашей модели цены курса рубля в тенге)

Выше мы включаем суперболочные дни как игра в плей-офф, так и игры в супербол. Это означает, что эффект superbowl будет дополнительным добавочным бонусом поверх эффекта плей-офф.

Когда таблица создана, праздничные эффекты включаются в прогноз, передавая их “holidays” аргументом.

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
forecast <- predict(m, future)

Эффект праздника можно увидеть в “forecast” кадре данных:

forecast %>%
  select(kurs, playoff, superbowl) %>% 
  filter(abs(playoff + superbowl) > 0) %>%
  tail(10)

Эффекты праздника также будут отображаться на графике компонентов, где мы видим, что в дни вокруг выступлений в плей-офф есть всплеск, особенно сильный всплеск для суперкубка:

prophet_plot_components(m, forecast)

Output graph

** Ряды Фурье для сезонности

Сезонность оценивается с использованием частичной суммы Фурье. Частичная сумма Фурье может приближаться к произвольному периодическому сигналу. Число членов в частичной сумме (порядок) является параметром, определяющим, насколько быстро может измениться сезонность. Чтобы проиллюстрировать это, рассмотрите данные Пейтона Мэннинга из Quickstart. Стандарт Фурье по умолчанию для годовой сезонности составляет 10, что дает такую форму:

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance

1

prophet:::plot_yearly(m)

Output graph

Значения по умолчанию часто подходят, но их можно увеличить, когда сезонность должна соответствовать изменениям более высоких частот и, как правило, быть менее плавной. Порядок Фурье может быть задан для каждой встроенной сезонности при создании экземпляра модели, здесь он увеличивается до 20:

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance

2

prophet:::plot_yearly(m)

Output graph2

add_seasonality

Увеличение числа рядов Фурье позволяет сезонности соответствовать более быстрым изменениям циклов, но также может привести к переопределению: N членов Фурье соответствует 2N переменным, используемым для моделирования цикла

** Определение пользовательских сезонов

Пророк по умолчанию будет соответствовать еженедельной и ежегодной сезонности, если временной цикл длится более двух циклов. Он также будет соответствовать ежедневной сезонности для субодневных временных рядов. Вы можете добавить другие сезоны (ежемесячно, ежеквартально, ежечасно) с помощью “add_seasonality” функции (R)

Входы этой функции - это имя, период сезонности в днях и порядок Фурье для сезонности. Для справки, по умолчанию Пророк использует порядок Фурье 3 для недельной сезонности и 10 для сезонной сезонности. Дополнительным вводом “add_seasonality” является предварительная шкала для этого сезонного компонента - это обсуждается ниже.

Например, здесь мы подходим к данным Peyton Manning из Quickstart, но заменяем недельную сезонность месячной сезонностью. Затем ежемесячная сезонность появится на участке компонентов:

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance

1

forecast <- predict(m, future)
prophet_plot_components(m, forecast)

Output graph

** Предварительная шкала для праздников и сезонности

Если вы обнаружите, что праздники переработаны, вы можете настроить их прежнюю шкалу, чтобы сгладить их с помощью параметра “holidays_prior_scale”. По умолчанию этот параметр равен 10, что обеспечивает очень мало регуляризации. Уменьшение этого параметра смягчает праздничные эффекты:

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
          ds   playoff superbowl
1 2010-01-16 0.1302048         0
2 2013-01-12 0.1302048         0

Величина эффекта праздника была уменьшена по сравнению с предыдущим, особенно для суперкубок, у которых было наименьшее количество наблюдений. Существует параметр, “seasonality_prior_scale” который аналогичным образом регулирует степень, в которой модель сезонности будет соответствовать данным.

Предварительные масштабы могут быть установлены отдельно для отдельных праздников, включая столбцы prior_scaleв кадре данных календаря. Предыдущие шкалы для отдельных сезонов могут быть переданы в качестве аргумента “add_seasonality”. Например, предварительная шкала для только недельной сезонности может быть установлена с использованием:

** Дополнительные регрессоры

Дополнительные регрессоры могут быть добавлены к линейной части модели с использованием “add_regressor” метода или функции. Столбец с значением регрессора должен присутствовать как в фреймах данных фитинга, так и в прогнозировании. Например, мы можем добавить дополнительный эффект по воскресеньям во время сезона НФЛ. На участке компонентов этот эффект будет отображаться на участке «extra_regressors»:

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
prophet_plot_components(m, forecast)

Output graph

“add_regressor”

По воскресеньям NFL также можно было обработать, используя описанный выше интерфейс «праздники», создав список прошлых и будущих воскресенья NFL. “add_regressor” функция обеспечивает более общий интерфейс для определения дополнительных линейных регрессоров и, в частности, не требует, чтобы регрессор был двоичным индикатором. В качестве регресса можно использовать другой временной ряд, хотя его будущие значения должны быть известны.

“add_regressor” Функция имеет дополнительные аргументы для определения предварительного масштаба (праздник до масштаба используется по умолчанию) и является ли или не стандартизирован регрессора - см с строку документации “?add_regressor” в R. Заметим , что регрессоры должны быть добавлены до подгонки модели.

Дополнительный регресс должен быть известен как для истории, так и для будущих дат. Таким образом, это должно быть либо то, что известно о будущих значениях (таких как “nfl_sunday”), либо то, что отдельно было предсказано в другом месте. Пророк также будет вызывать ошибку, если регрессор будет постоянным на протяжении всей истории, поскольку с ним ничего не подойдет.

В линейный компонент модели вводятся дополнительные регрессоры, поэтому базовая модель состоит в том, что временные ряды зависят от дополнительного регрессора в качестве аддитивного или мультипликативного фактора.

add_regressor

В кадре данных, переданном «fit» и «pred», будет указан столбец с указанным именем, которое будет использоваться как регресс. Когда standardize = ‘auto’, регрессор будет стандартизован, если он не является двоичным. коэффициент регрессии дается ранее с заданным параметром шкалы. Уменьшение прежней шкалы добавит дополнительную регуляризацию. Если предварительная шкала не указана, будет использоваться holiday.prior.scale. Режим может быть указан как «аддитивный» или «мультипликативный». Если не указано, m$seasonality.mode будет использован. «additive» означает, что эффект регресса будет добавлен в тренд, «мультипликативный» означает, что он будет умножать тренд.

add_regressor(m, name, prior.scale = NULL, standardize = "auto", mode = NULL)
  • m ~ Объект prophet

  • name ~ Строковое имя регресса

  • prior.scale ~ Плавающая шкала для нормализованого предществуюшего. Если это не предусмотрено, holidays.prior.scale будут использованы.

  • standardize ~ укажите, будет ли этот регрессор стандартизован до установки. Возможно ‘auto’ (стандартизировать, если не бинарно), True или False

  • mode ~ Необязательно, «аддитивный» или «мультипликативный». По умолчанию m$seasonality.mode

Мультипликативный сезонность

** По умолчанию Пророк подходит для присадочных сезонов, что означает, что эффект сезонности добавляется к тенденции получения прогноза.

Initial log joint probability = -18.9686
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
future <- make_future_dataframe(m, 50, freq = 'm')
forecast <- predict(m, future)
plot(m, forecast)

Output graph

Prophet

может моделировать мультипликативную сезонность, задавая " seasonality_mode=‘multiplicative’ “входные аргументы: {data-height=200}

m <- prophet(kurs, seasonality.mode = 'multiplicative')
forecast <- predict(m, future)
plot(m, forecast)

Компонент теперь покажет сезонность в процентах от тенденции:

Output graph

С seasonality_mode=‘multiplicative’

праздничные эффекты также будут моделироваться как мультипликативные. Любые добавленные сезоны или дополнительные регрессоры по умолчанию будут использовать все, что угодно”seasonality_mode“, но могут быть переопределены путем указания” mode=‘additive’ " или " mode=‘multiplicative’ " в качестве аргумента при добавлении сезонности или регрессора.

Например, этот блок устанавливает мультипликативную функцию сезонности, но включает в себя добавку квартальной сезонности и аддитивный регресс:

m <- prophet(seasonality.mode = 'multiplicative')
m <- add_seasonality(m, 'quarterly', period = 91.25, fourier.order = 8, mode = 'additive')
m <- add_regressor(m, 'regressor', mode = 'additive')

Добавочные и мультипликативные дополнительные регрессоры будут отображаться в отдельных панелях на участке компонентов.

Недневные данные

** Суб-ежедневные данные

Пророк может делать прогнозы для временных рядов с субодневными наблюдениями, передавая в кадре данных временные метки в dsстолбце. Формат временных меток должен быть ГГГГ-ММ-ДД ЧЧ: ММ: СС - см. Пример: Когда используются субодневные данные, ежедневная сезонность автоматически будет соответствовать. Здесь мы подходим к Пророку к данным с 5-минутным разрешением (суточные температуры в Йосемите):

Initial log joint probability = -1444.46
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
future <- make_future_dataframe(m, periods = 300, freq = 60 * 60)
fcst <- predict(m, future)
plot(m, fcst)

Output graph

Ежедневная сезонность будет отображаться на участке компонентов:

prophet_plot_components(m, fcst)

Output graph

** Данные с регулярными пробелами

Предположим, что в приведенном выше наборе данных были наблюдения от 12 до 6:

Initial log joint probability = -467.044
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
future <- make_future_dataframe(m, periods = 300, freq = 60 * 60)
fcst <- predict(m, future)
plot(m, fcst)

Output graph

Прогноз

Прогноз кажется довольно плохим, с гораздо большими колебаниями в будущем, чем это было в истории. Проблема здесь в том, что мы применили ежедневный цикл к временному ряду, который имеет только данные для части дня (12-6). Таким образом, ежедневная сезонность остается неограниченной на оставшуюся часть дня и не оценивается хорошо. Решение состоит в том, чтобы делать прогнозы только для окон времени, для которых есть исторические данные. Здесь это означает, что для ограничения “future”" кадра данных требуется время от 12 до 6:

future2 <- future %>% 
  filter(as.numeric(format(ds, "%H")) < 6)
fcst <- predict(m, future2)
plot(m, fcst)

Output graph

Диагностика

другим наборам данных с регулярными пробелами в данных. Например, если история содержит только будние дни, то прогнозы следует делать только по будням, так как недельная сезонность не будет хорошо оценена в выходные дни.

*** Диагностика (проверка моделей)

Пророк включает в себя функциональность для перекрестной проверки временных рядов для измерения ошибки прогноза с использованием исторических данных. Это делается путем выбора точек отсечки в истории и для каждого из них подгонка модели с использованием данных только до этой точки отсечки. Затем мы можем сравнить прогнозируемые значения с фактическими значениями.

Эта процедура перекрестной проверки может быть выполнена автоматически для ряда исторических прерываний с использованием “cross_validation” функции. Мы указываем горизонт прогноза (horizon), а затем необязательно размер начального периода обучения (initial) и интервал между датами отсечения (period). По умолчанию начальный период обучения устанавливается в три раза по горизонтали, а отсечки выполняются каждые пол-горизонта.

Результатом “cross_validation”" является кадр данных с истинными значениями yи прогнозируемыми значениями вне выборки yhatна каждую смоделированную дату прогноза и каждую дату отсечения. В частности, делается прогноз для каждой наблюдаемой точки между “cutoff и cutoff + horizon”. Это “dataframe” может быть использован для вычисления меры об ошибках yhatпротив прогноза y.

Пример cross_validation (Перекрёстная модель)

df_cross <- cross_validation(m, initial = 730, period = 180, horizon = 365, units = 'days')
head(df.cv)

“performance_metrics”" Утилита может быть использована для вычисления некоторых полезных статистических данных о производительности прогнозирования (yhat, yhat_lowerи по yhat_upper сравнению с y), в зависимости от расстояния от среза (насколько далеко в будущем предсказании было). Вычисленная статистика представляет собой среднеквадратичную ошибку (MSE), среднеквадратичную ошибку (RMSE), среднюю абсолютную ошибку (MAE), среднюю абсолютную процентную погрешность (MAPE) и охват yhat_lowerи yhat_upperоценки. Они вычисляются по календарю предсказаний df_cv после сортировки по горизонту ( ds минус cutoff). По умолчанию 10% прогнозов будут включены в каждое окно, но это может быть изменено с помощью rolling_window аргумента.

df.p <- performance_metrics(df_cross)
head(df.p)

Показатели производительности перекрестной проверки можно визуализировать с помощью plot_cross_validation_metric здесь, для MAPE. Точки показывают абсолютную процентную погрешность для каждого прогноза df_cv. Синяя линия показывает MAPE, где среднее значение берется по катящемуся окну точек. Мы видим для этого прогноза, что ошибки около 5% типичны для прогнозов на один месяц в будущем, и что ошибки увеличиваются примерно до 11% для прогнозов, которые являются годом.

plot_cross_validation_metric(df.cv, metric = 'mape')

– FUNCTION PROPHET

prophet(df = NULL, growth = "linear", changepoints = NULL,
n.changepoints = 25, changepoint.range = 0.8,
yearly.seasonality = "auto", weekly.seasonality = "auto",
daily.seasonality = "auto", holidays = NULL,
seasonality.mode = "additive", seasonality.prior.scale = 10, holidays.prior.scale = 10, changepoint.prior.scale = 0.05, mcmc.samples = 0, interval.width = 0.8, uncertainty.samples = 1000, fit = TRUE, ...)
  • df ~ Dataframe, содержащий историю. Должны иметь столбцы ds (тип даты) и y-временные ряды. Если рост логичен, то df также должен иметь колпачок который определяет емкость в каждом ds. Если это не предусмотрено, то объект модели будет быть создан, но не подходит; используйте fit.prophet (m, df), чтобы соответствовать модели.

  • growth ~ Строка «linear» или «logistic» для указания линейного или логистического тренда.

  • changepoints ~ Вектор дат, в который должны включаться потенциальные точки изменения. Если не указано, потенциальные точки изменения выбираются автоматически.

  • n.changepoints ~ Количество потенциальных точек изменения, которые необходимо включить. Не используется, если входные значения “changepoints” в комплект поставки. Если «changepoints» не предоставляется, то n.changepoints потенциальный контрольные точки выбираются равномерно из первого параметра “changepoint.range” df$ds

  • changepoint.range ~ Пропорция истории, в которой будут оцениваться точки изменения тренда. По умолчанию 0,8 для первых 80 «changepoint»

  • yearly.seasonality ~ Подходите к ежегодной сезонности. Может быть «auto», «TRUE», «FALSE» или «Фурье» термины для генерации

  • weekly.seasonality ~ Подходите еженедельно. Может быть «auto», «TRUE», «FALSE» или «Фурье» термины для генерации.

  • daily.seasonality ~ Подходит ежедневная сезонность. Может быть «auto», «TRUE», «FALSE» или «Фурье» термины для генерации.

  • holidays ~ кадр данных с отпусками столбцов (символ) и ds (тип даты) и необязательно столбцы lower_window и upper_window, которые определяют диапазон дней вокруг дата, которая будет включена в качестве праздников. lower_window = -2 будет включать 2 дня до до даты праздников. Также необязательно может иметь столбец before_scale указать- в предыдущей шкале для каждого праздника

  • seasonality.mode ~ «additive» (по умолчанию) или «multiplicative»

  • seasonality.prior.scale ~ Параметр, модулирующий силу модели сезонности. Большие значения позволяют модель, чтобы соответствовать более крупным сезонным колебаниям, меньшие значения уменьшают сезонно- Эк. Может быть указано для отдельных сезонов, используя add_seasonality

  • holidays.prior.scale ~ Параметр, модулирующий силу модели праздничных компонентов, если только переопределяется на входе праздников

  • changepoint.prior.scale ~ Параметр, модулирующий гибкость выбора автоматической замены. Большие значения позволят многим точкам изменения, малые значения позволят несколько изменений, точки

  • mcmc.samples ~ Целое число, если оно больше 0, сделает полный байесовский вывод с указанным номером, образцов MCMC. Если 0, будет выполнена оценка MAP

  • interval.width ~ Числовая, ширина интервалов неопределенности, предусмотренных для прогноза. Если mcmc.samples = 0, это будет только неопределенность в тренде, используя оценку MAP ex- ловушечной генеративной модели. Если mcmc.samples> 0, это будет интегрировано по всем параметры модели, которые будут включать неопределенность в сезонности

  • uncertainty.samples ~ Количество смоделированных ничьих, используемых для оценки интервалов неопределенности

  • fit ~ Boolean, если FALSE, модель инициализируется, но не подходит

cross_validation (перекрестная проверка)

Вычисляет прогнозы из исторических точек отсечения. Начиная с (end - horizon), работает в обратном направлении делая отсечки с интервалом периода до достижения первоначального значения

cross_validation (model, horizon, units, period = NULL, initial = NULL)
  • model ~ Установленная модель prophet

  • horizon ~ Целочисленный размер горизонта

  • units ~ Строковая единица горизонта, например, “days”, “secs”

  • period ~ Целочисленное количество времени между датами отсечения. Те же единицы, что и горизонт (horizon). Если не предоставлено,используется 0,5 * horizon.

  • initial ~ Целочисленный размер первого периода обучения. Если не предоставлено, используется 3 * horizon. Те же единицы, что и horizon

Выводы: * Библиотека Prophet — удобный инструмент для прогнозирования временных рядов. Модель работает достаточно хорошо, при этом есть набор гиперпараметров, которые позволяют улучшить прогноз. * Отдельно стоит отметить встроенные возможности визуализации. * Задача прогнозировать колебания валюты — сложная. * Prophet хорошо аппроксимирует обучающую выборку. Стоит отметить и разумно выделенную годовую сезонность. * Полученные предсказания можно использовать как новый признак для других алгоритмов машинного обучения. * Из минусов — проект достаточно молодой, возможны какие-то неточности в работе. Неполная документация.

All rights reserved

Flexdashboard

Column

Для начала

Flexdashboard - интерактивный инструмент для визуализации данных в R.

  • Группировка нескольких RMarkdown-ов
  • Поддерживает htmlwidgets; базовую, решетчатую и сетчатую графику; табличные данные; датчики и шкалы значений, а также текстовые аннотации.
  • Адаптированы для отображения на веб-браузерах и мобильных устройствах.
  • Можно использовать Shiny для динамичной визуализации данных.
  1. Устанавливаем библиотеку
  • Устанавливаем пакет flexdashboard:

*install.packages("flexdashboard")*

library(flexdashboard)

  1. Создаем новый R Markdown, выбираем Flex Dashboard
  2. Если вы не использете R Studio, можно создать Flexdashboard через R Console
rmarkdown::draft("dashboard.Rmd", template = "flex_dashboard", package = "flexdashboard")

Расположение (Layout)

  1. Ориентирование (Orientation)
  • По столбцам

По умолчанию (——————) , макеты располагаются вертикально по столбцам:

title: "Column Orientation"
output: flexdashboard::flex_dashboard
  • По строкам

Можно поменять расположение по строкам, указав

orientation: rows

---
title: "Row Orientation"
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
---
  1. Прокрутка (Scrolling Layout)

По умолчанию графики автоматически запоняют браузер. Если их несколько, удобнее будет скролить. Для это используем функцию vertical_layout.

fill - графики располагаются на весь браузер

scroll - прокручиваются произвольно, не сжимаясь:

---
title: "Chart Stack (Scrolling)"
output: 
  flexdashboard::flex_dashboard:
    vertical_layout: scroll
---
  1. Табы (Tabsets)

Используем функцию {.tabset} для создания табуляции:

Column {.tabset}
-------------------------------------

{.tabset-fade} - тени для различения неактивной табуляции

Компоненты

1. HTML Widgets

Framework c динамичными библиотеками JavaScript. Доступные:

  • leaflet - библиотека для создания динамических карт, поддерживающих панорамирование и масштабирование, с различными аннотациями, такими как маркеры, многоугольники и всплывающие окна.
  • dygraphs - составление диаграмм временных рядов данных, поддержка интерактивных функций, таких как выделение строк / точек, масштабирование и панорамирование.
  • plotly - через интерфейс ggplotly позволяет перевести графику ggplot2 в интерактивную веб-версию.
  • rbokeh - структура Bokeh для создания веб-графиков.
  • Highcharter - графическая библиотека JavaScript Highcharts.
  • visNetwork - визуализация данных с помощью библиотеки vis.js.

В CRAN имеется более 30 пакетов htmlwidgets.

htmlwidgets используются в R Markdown так же, как и обычные графики.

  • Минусы: долго грузятся при работе с большим кол. данных

2. R Graphics

Можно использовать любой график, созданный со стандартной графикой R (base, lattice, grid, etc.)

fig.width - указываем ширину графика

fig.height - указываем высоту графика

{r, fig.width=10, fig.height=7}
plot(cars)

3. Tabular Data

Два вида:

  1. Как простой статичный график. knitr::kable
{r}
knitr::kable(mtcars)
  1. Динамичные графики, которые включают сортировку, фильтрацию и разбивку на страницы.

shiny::renderTable - для пакета Shiny

{r}
renderTable({
  head(mtcars, n = input$rows)
})

Data Table

Пакет DT может отображать матрицы или датафрэймы в виде интерактивных HTML-таблиц, которые поддерживают фильтрацию, разбиение на страницы и сортировку.

install.packages("DT")

DT::datatable - функция для добавления DataTable

{r}
DT::datatable(mtcars, options = list(
  bPaginate = FALSE
))

bPaginate = FALSE - включение скроллинга при работе с маленькими данными

pageLength - нужно указать при работе с большими данными

{r}
DT::datatable(mtcars, options = list(
  pageLength = 25
))

4. Value Boxes

Можно использовать функцию valueBox для отображения отдельных значений вместе с заголовком и дополнительным значком.

{r}
comments <- computeComments()
valueBox(comments, icon = "fa-comments")

Icons:

  1. Font Awesome
  2. Ionicons
  3. Bootstrap Glyphicons

Использование: ( “fa-github”, “ion-social-twitter”, “glyphicon-time”, etc.)

5. Navigation Bar

По умолчанию панель навигации flexdashboard включает в себя функции: title, author, date.

Еще можно добавить ссылки на соц.сети и код.

---
title: "Social Links and Source code"
output: 
  flexdashboard::flex_dashboard:
    social: [ "twitter", "facebook", "menu" ]
     source_code: embed
---

navbar - функция позволяет добавлять любые ссылки:

---
title: "Navigation Bar"
output: 
  flexdashboard::flex_dashboard:
    navbar:
      - { title: "About", href: "https://example.com/about", align: left }
---

6. Text Annotations

> - для заметок:

> Monthly deaths from lung disease in the UK, 1974–1979

.no-title - убрать все заголовки:

### All Lung Deaths {.no-title}

Размеры

1. Ширина и высота

  • data-width

  • data-height

  {data-height=650}
  • Паддинг (Chart Padding) - по умолчанию 8px

.no-padding - убрать паддинги

### Chart 1 {.no-padding}

data-padding - указать определенный размер паддинга

### Chart 2 {data-padding=10}

Storyboards

1. Как создать

Последовательность визуализации данных и связанных с ним комментариев.

  1. Добавляем функцию: storyboard: true
  2. Указываем level 3 ``(###)``` dashboard components
    storyboard: true
---

### Frame 1

{.storyboard} - если хотим использовать только на определенной странице

---
title: "Storyboard Page"
output: flexdashboard::flex_dashboard
---

Analysis {.storyboard}
=========================================

### Frame 1

### Frame 2

Details
=========================================

Column
-----------------------------------------

3. Комментарии

(***) - добавляет комментарии

---
title: "Storyboard Commentary"
output: 
  flexdashboard::flex_dashboard:
    storyboard: true
---

### Frame 1

*** 

Some commentary about Frame 1.

### Frame 2 {data-commentary-width=400}

*** 

Some commentary about Frame 2.

data-commentary-width - размер блока комментарий

Вид

1. Темы

theme - функция для установления темы

Виды:

  • default
  • cosmo
  • bootstrap
  • cerulean
  • journal
  • flatly
  • readable
  • spacelab
  • united
  • lumen
  • paper
  • sandstone
  • simplex
  • yeti
---
title: "Themes"
output: 
  flexdashboard::flex_dashboard:
    theme: bootstrap
---

2. Стили CSS

css. - функция позволяет добавлять разные стили css:

Можно использовать Bootswatch, а также https://github.com/rstudio/flexdashboard/tree/feature/logo-and-favicon/inst/rmarkdown/templates/flex_dashboard/resources

title: "Custom CSS"
output: 
  flexdashboard::flex_dashboard:
    css: styles.css

3. Логотип и Фавикон

Основные функции:

logo

favicon

---
    logo: logo.png
    favicon: favicon.png
---

Дополнительно

  • Shiny - для работы с динамичными графиками

  • Examples - рабочие примеры проектов с Flexdashboard

All rights reserved